这是我的第一篇博客,我觉得得写点东西能记录下我到底学到了什么,第一篇写关于ListView的一些东西吧。
ListView的优化
listview优化其实主要是两方面,
- convertView视图的回收,滑出控件可视范围的ItemView会被放入视图回收器中,适配器中的getView方法会传进convertView,如果convertView不为空,说明有可回收视图,就可以不用生成视图,但该视图可能有旧的数据,需要重新赋值。
- findViewById的效率是很低的,如果每次返回对象都要用findViewbyid来找控件填值,会影响listview的性能。view对象提供了一个方法setTag(Object),我们可以建立一个内部类viewholder(可以随意命名),里面存储一些view中的控件对象,然后把对象放进setTag里,这下找控件就可以通过在holder对象直接找,比findviewbyid快多了。
优化前的代码
public View getView(int position, View convertView, ViewGroup parent) {
// 视图对象,假设视图中有个控件TextView
View view = View.inflate(getBaseContext(), R.layout.item_list, null);
TextView text = (TextView)view.findViewById(R.id.tv);
text.setText("优化前");
return view;
}
优化后
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder=null;
if(convertView==null){//convertViewde是否可以回收的判断
convertView = View.inflate(getBaseContext(), R.layout.item_list, null);
holder=new HolderView();
holder.tv= (TextView)view.findViewById(R.id.tv);
convertView.setTag(holder);//把已经找好控件的holder对象放进视图标记中
}
else{
//可回收的convertView中就不用再findViewbyid了
holder=(ViewHolder)convertView.getTag();
}
holder.tv.setText("优化后");
return convertView;
}
//该类是自己建的BaseAdapter的内部类,
private static class HolderView{
//存储着视图要找的控件
public TextView tv;
}