使用ConvertView和ViewHolder的优化是针对ListView的Adapter(BaseAdapter)的。这种优化的优点如下:
1)重用了ConveertView,在很大程度上减少了内存的消耗。通过判断ConvertView是否为NULL,如果是NULL那么就需要生成一个新的View出来(通过LayoutInflater生成),绑定数据后显示给用户;如果ConvertView不是NULL,则我们需要做的就只有绑定数据并呈现给用户。
2)由于ListView中的Item往往都是只有一个模板,即整个ListView的所有Item用的都是一套ID,所以我们可以把findViewById()方法提取出来,即全程之找一遍ID,这样可以避免让程序不停的做同样的事情。这样做的话通常需要用到另一个内部类(通常写成ViewHolder,在这个类中定义Item中需要用到的控件的名称),这样做也可以方便我们调用控件的onClick()事件等等。
3)综上,这样做不仅减少了项目性能的消耗,也减少了内存的消耗。

下面贴代码。先介绍一下这段代码,这是笔者从一个“图灵机器人”的程序中截取出来的一个BaseAdapter,其中的ChatMessage是聊天内容的实体类,其中有text(聊天的内容)、type(对方说话或者我方说话)等属性。代码如下:

 public class ChatListAdapter extends BaseAdapter {
public static List<ChatMessage> chatList;
private LayoutInflater inflater; public ChatListAdapter(Context context) {
chatList = new ArrayList<ChatMessage>();
inflater = LayoutInflater.from(context);
chatList.add(new ChatMessage("您好,我是小慕,有什么可以帮您的吗?", Type.ANSWER));
} @Override
public int getCount() {
return chatList.size();
} @Override
public Object getItem(int position) {
return chatList.get(position);
} @Override // 返回某个位置的Item的类型(对面说话还是我方说话)
public int getItemViewType(int position) {
// Type是在ChatMessage中定义的枚举类型的变量,有两个枚举值:ASK表示我向“小慕”提问,ANSWER表示“小慕”回答我
if (chatList.get(position).getType() == Type.ASK) {
return 0;
} else {
return 1;
}
} @Override // 返回ListView有几种类型的Item
public int getViewTypeCount() {
return 2;
} @Override
public long getItemId(int position) {
return position;
} @Override // 布局Item
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) { // 如果为空,就表示是第一次加载,还没有加入到缓存中
holder = new ViewHolder();
if (getItemViewType(position) == 0) { // 我方说话
convertView = inflater.inflate(R.layout.sideworks_chatlist_item_ask, null);
holder.time = (TextView) convertView.findViewById(R.id.control_chatitem_ask_time);
holder.info = (TextView) convertView.findViewById(R.id.control_askitem_message);
} else if (getItemViewType(position) == 1) { // 对方说话
convertView = inflater.inflate(R.layout.sideworks_chatlist_item_reply, null);
holder.time = (TextView) convertView.findViewById(R.id.control_chatitem_reply_time);
holder.info = (TextView) convertView.findViewById(R.id.control_replyitem_message);
}
convertView.setTag(holder); // 加入缓存
} else {
holder = (ViewHolder) convertView.getTag(); // 如果ConvertView不为空,则表示在缓存中
}
holder.time.setText(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(new Date()));
holder.info.setText(chatList.get(position).getText());
return convertView;
} // 自定义的容器类(相当于一个Item),其中放置着需要我们放置数据的控件的名称
private static class ViewHolder {
TextView time;
TextView info;
}
}

最后说一下,当我们说了话或者对方说了话,我们就需要更新视图,方法是:先在chatList中添加一条数据,然后调用BaseAdapter(注意一定要是同一个Adapter实例)的notifyDataSetChanged()方法进行刷新。

Android之ListView性能优化——使用ConvertView和ViewHolder的更多相关文章

  1. Android之ListView性能优化——一行代码绑定数据——万能适配器

    如下图,加入现在有一个这样的需求图,你会怎么做?作为一个初学者,之前我都是直接用SimpleAdapter结合一个Item的布局来实现的,感觉这样实现起来很方便(基本上一行代码就可以实现),而且也没有 ...

  2. 转-ListView的性能优化之convertView和viewHolder

    ListView的性能优化之convertView和viewHolder 2014-05-14 参考:http://www.cnblogs.com/xiaowenji/archive/2010/12/ ...

  3. ym——Android之ListView性能优化

    转载请注明本文出自Cym的博客(http://blog.csdn.net/cym492224103),谢谢支持! Android之ListView性能优化 假设有看过我写过的15k面试题的朋友们一定知 ...

  4. ListView的性能优化之convertView和viewHolder

    转载请注明出处 最近碰到的面试题中经常会碰到问"ListView的优化"问题.所以就拿自己之前写的微博客户端的程序做下优化. 自己查了些资料,看了别人写的博客,得出结论,ListV ...

  5. Android之ListView性能优化

    ListView滚动速度优化主要可以应用以下几点方法来实现: 1.使用Adapter提供的convertView convertView是Adapter提供的视图缓存机制,当第一次显示数据的时候,ad ...

  6. ListView性能优化——convertView&viewHolder

    ListView优化大致从以下几个角度:1.复用已经生成的convertView:2.添加viewHolder类:3.缓存数据(图片缓存):4.分页加载. 具体方案: 1.如果自定义适配器,那么在ge ...

  7. Android进阶笔记14:ListView篇之ListView性能优化

    1. 首先思考一个问题ListView如何才能提高效率 ? 当convertView为空时候,用setTag()方法为每个View绑定一个存放控件的ViewHolder对象.当convertView不 ...

  8. Android进阶笔记11:ListView篇之ListView性能优化

    1. 首先思考一个问题ListView如何才能提高效率 ? 当convertView为空时候,用setTag()方法为每个View绑定一个存放控件的ViewHolder对象.当convertView不 ...

  9. Android ListView性能优化实例讲解

    前言: 对于ListView,大家绝对都不会陌生,只要是做过Android开发的人,哪有不用ListView的呢? 只要是用过ListView的人,哪有不关心对它性能优化的呢? 关于如何对ListVi ...

随机推荐

  1. 编译安装zabbix3.2

    1.1 环境准备 系统环境准备:redhat 6.6 64位mysql-5.6.34php-5.6.28zabbix-3.2.1配置前先关闭iptables和SELINUX,避免安装过程中报错. # ...

  2. MYSQL 基本SQL语句

    复制表结构 CREATE TABLE 新表 SELECT * FROM 旧表 where 1=2 复制表结构和数据CREATE TABLE 新表 SELECT * FROM 旧表 查询重复数据: se ...

  3. sql一个表中的数据插入到另外一个表中

    声名:a,b ,都是表 复制代码代码如下: --b表存在(两表结构一样)  insert into b select * from a  若两表只是有部分(字段)相同,则 复制代码代码如下: inse ...

  4. 关于对For循环嵌套优化的问题

    1.案例描述 由于一次Java面试的笔试题,当时没有写出很好的解决方案,特此专门撰写一篇博客来加以记录,方便日后的查看 面试题目如下:从性能上优化如下代码并说明优化理由? for (int i = 0 ...

  5. /var/log/messages

    messages 该日志文件是许多进程日志文件的汇总,从该文件可以看出任何入侵企图或成功的入侵,包括整体系统信息,是系统最核心的日志.它包含了系统启动时的引导消息,以及系统运行时的其他状态消息.IO ...

  6. JAVA设计模式之1-单例模式

    设计模式是什么? 设计模式是一种思路,是在前辈们的软件工程中总结出来的套路,并且这些套路已经经过很多项目的测试,是比较成熟的思路,所以现在来总结一下常见的设计模式. 最简单最常用的就是单例模式: 一般 ...

  7. docker学习(6) docker中搭建java服务及nginx反向代理

    先看下容器规划: 上图中mysql容器的搭建见上篇博客,service1/2为java rest service,创建脚本如下: docker run -d -h service1 \ -v /Use ...

  8. 5G系统架构

    原文标题:迈向5G之路,颠覆性的5G系统架构?   本文部分图片,资料摘自<迈向5G C-RAN:需求.架构与挑战> 突如一夜春风来,随着Polar码与LDPC码作为5G编码候选方案,通信 ...

  9. WinRAR5.4

    Winrar是一款优秀的压缩解压工具! 免费版   :http://www.winrar.com.cn/                  ###加载启动广告,支持正版 海阔天空:http://pan ...

  10. Python小白的发展之路之Python基础(一)

    Python基础部分1: 1.Python简介 2.Python 2 or 3,两者的主要区别 3.Python解释器 4.安装Python 5.第一个Python程序 Hello World 6.P ...