ListView的二种优化

来源:互联网 发布:安卓玩pc java游戏 编辑:程序博客网 时间:2024/05/18 08:16

一、图像

ListView优化主要有下面几个方面:

1、convertView重用

2、ViewHolder的子View复用

3、缓存数据复用



一、convertView复用

ListView中的每一个Item显示都需要Adapter调用一次getView()的方法,这个方法会传入一个convertView的参数,这个方法返回的View就是这个Item显示的View。如果当Item的数量足够大,再为每一个Item都创建一个View对象,必将占用很多内存空间,即创建View对象(mInflater.inflate(R.layout.lv_item, null);从xml中生成View,这是属于IO操作)是耗时操作,所以必将影响性能。Android提供了一个叫做Recycler(反复循环)的构件,就是当ListView的Item从滚出屏幕视角之外,对应Item的View会被缓存到Recycler中,相应的会从生成一个Item,而此时调用的getView中的convertView参数就是滚出屏幕的缓存Item的View,所以说如果能重用这个convertView,就会大大改善性能。

public View getView(int position, View convertView, ViewGroup parent) {
View v;


if (convertView == null) {
v = View.inflate(MainActivity.this, R.layout.item, null);
} else {
v = convertView;
}
ImageView pic=(ImageView) v.findViewById(R.id.iv_pic);
TextView content=(TextView) v.findViewById(R.id.tv_Content);
TextView source=(TextView) v.findViewById(R.id.tv_Source);
content.setText("云南现罕见物种金钱活门蛛 中国目前仅发现6只");
source.setText("凤凰网 03-18 21:42 热点");
pic.setImageResource(R.drawable.img);
return v;
}

二、使用ViewHolder

我们都知道在getView()方法中的操作是这样的:先从xml中创建view对象(inflate操作,我们采用了重用convertView方法优化),然后在这个view去findViewById,找到每一个item的子View的控件对象,如:ImageView、TextView等。这里的findViewById操作是一个树查找过程,也是一个耗时的操作,所以这里也需要优化,写一个内部类ViewHolder用于对控件的实例进行缓存。当 convertView 为空 的时候,创建一个 ViewHolder 对象,并将控件的实例都存放在 ViewHolder 里,然后调用 View 的 setTag()方法,将 ViewHolder 对象存储在 View 中。当 convertView 不为空的时候则调用 View 的 getTag()方法,把 ViewHolder 重新取出。这样所有控件的实例都缓存在了 ViewHolder 里,就没有必要每次都通过   findViewById()方法来获取控件实例了。


View v ;
ViewHolder viewHolder;
if (convertView==null) {
v = View.inflate(MainActivity.this, R.layout.item, null);
viewHolder=new ViewHolder();
viewHolder.pic=(ImageView) v.findViewById(R.id.iv_pic);
viewHolder.content=(TextView) v.findViewById(R.id.tv_Content);
viewHolder.source=(TextView) v.findViewById(R.id.tv_Source);
v.setTag(viewHolder);//将viewholder存到View中
}else
{
v=convertView;
viewHolder=(ViewHolder) v.getTag();
}
viewHolder.content.setText("云南现罕见物种金钱活门蛛 中国目前仅发现6只");
viewHolder.source.setText("凤凰网 03-18 21:42 热点");
viewHolder.pic.setImageResource(R.drawable.img);
return v;

}
class ViewHolder{
ImageView pic;
TextView content;
TextView source;
}
}