使用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()方法进行刷新。

最新文章

  1. xv6的课本翻译之——附录B 系统启动器
  2. MySQL数据库1067 问题
  3. 【皇甫】☀IOC和AOP的拓展实例
  4. 【Java每日一题】20161025
  5. 使用ngin的静态文件下载
  6. Effective C++学习笔记 条款04:确定对象被使用前已先被初始化
  7. Gink掉过的坑(一):将CCTableView导入到lua中
  8. 游戏UI框架设计(四) : 模态窗体管理
  9. ubuntu 14.04 64位安装HTK3.5
  10. 浅谈SSH框架
  11. springboot2.X访问静态文件配置
  12. #个人作业Week2——结对编程对象代码复审
  13. Java动态性之反射机制(reflection)
  14. ST推出新软件STM32Cube ,让STM32微控制器应用设计变得更容易、更快、更好用
  15. [PAT]A+B Format[简单]
  16. linux下带有空格的文件怎么删除
  17. bzoj千题计划153:bzoj2431: [HAOI2009]逆序对数列
  18. JavaEE各种Javadoc的下载
  19. python 判断列表字符串元素首尾字符是否相同
  20. 克鲁斯卡尔(并查集)hdu 1233

热门文章

  1. nandflash驱动程序编写
  2. excel基本
  3. 产生冠军 hdoj_2094 巧用set
  4. mac上设置新版chrome浏览器跨域
  5. [原]导入OpenStreetMap海图数据,并在GeoServer上发布
  6. 20145222《信息安全系统设计基础》Linux常用命令汇总
  7. FFmpeg 转码和截屏
  8. [转] JAVA读取excel数据(插入oracle数据库)
  9. 通过一个实例重新认识引用类型,值类型,数组,堆栈,ref
  10. Android Studio导入项目遇到的问题