Adapter是listview和数据源间的中间人,当每条数据进入可见区域时,adapter的getview()会被调用,返回代表具体数据的视图;触摸滚动时,频繁调用;支持成百上千条数据。既然是大量数据,就会使用到很多布局,给布局绑定数据,listview将占用大量资源还可能会产生卡顿现象。
效果如下:
下面来看看代码:
1.利用convertview回收视图,效率提高
200
%。
if (convertView == null) { view = layoutInflater.inflate(R.layout.item, null); holder = new ViewHolder(); holder.imgIcon = (ImageView) view.findViewById(R.id.img_icon); holder.txtTitle = (TextView) view.findViewById(R.id.txt_title); holder.txtContent = (TextView) view.findViewById(R.id.txt_content); holder.txtNum = (TextView) view.findViewById(R.id.txt_num); view.setTag(holder); } else { view = convertView; holder = (ViewHolder) view.getTag(); } 2.利用viewholder模式,效率在提高50% static class ViewHolder { ImageView imgIcon; TextView txtTitle,txtContent,txtNum; }
在Adapter的代码中,在getView方法里首先判断convertView是否为空,若为空则加载相应布局,若不为空则直接
使用该布局,这能够很有效的使用Android为listview提供的缓存机制:只加载一屏的布局,之后滑动出来的item使
用的是之前已经加载的布局的缓存;而使用静态的ViewHoulder的目的则是节省了findViewById的时间。如果不使
用ViewHolder,每次getView的时候都需要得到一次子布局,而这也是很耗时并且耗资源的;如果使用了
ViewHolder作为子布局的缓存,使用View的setTag方法将缓存与每个item绑定,则也可以省去了findViewById的
事件;而将ViewHolder设置为static的目的是指在初始化Adapter时初始化一次这个内部类,否则将会在每次创建
Adapter时都要初始化一次,而这是没有必要的。
ListView的优化也是面试中常问的问题,这里总结一下:
1.convertView的复用,减少每次都去加载layout文件。
2.ViewHolder缓存item条目的引用,减少findviewbyid的次数。
3.要对数据进行分页加载,item的布局层级要越少越好,判断手势,快速滑动时不加载里面的图片,如果item中有图片一定要用异步加载,而且里面的图片尽量要用缩略图或者小图。这样分点列出,说明你是一个善于总结的人,能增加面试官对你的印象。
demo下载地址:http://download.csdn.net/detail/u014727709/9723931
欢迎start,欢迎评论,欢迎指正