ListView深入学习(1)
使用ViewHolder提高效率
listView的基础使用就不多介绍了,提一下BaseAdapter。
实现了BaseAdapter之后,listView的每个item会调用BaseAdapter里面的getView方法,这个方法会返回一个View,这个View就会被item使用。
所以重点已经很明显了,就是要优化getView方法。
首先拿出一段正常的getView方法
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
convertView=LayoutInflater.from(mContext).
inflate(R.layout.list_item, null); TextView tv=(TextView)convertView.findViewById(R.id.list_text);
tv.setText(mData.get(position));
return convertView;
}
里面核心的就是下面两句话
convertView=LayoutInflater.from(mContext).
inflate(R.layout.list_item, null); TextView tv=(TextView)convertView.findViewById(R.id.list_text);
目标也就是这两句。
1、第一句,每次在调用getView的时候都要重新inflate那个xml文件,所以可以先判断一下是否为空,为空了再来inflate也不迟。
第一句就变成了下面这个样子:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
if(convertView==null){
convertView=LayoutInflater.from(mContext).inflate(R.layout.list_item, null);
}else{
TextView tv=(TextView)convertView.findViewById(R.id.list_text);
tv.setText(mData.get(position));
}
return convertView;
}
2、第二句,每次都要通过得打的view来new一个新的对象。通过viewHolder可以将它们重复使用。
viewHolder使用的关键是View.setTag()这个方法,将view的一些数据存储起来。
这里就是将这些数据存进viewHolder里面,所以要写一个内部类ViewHolder,里面有两个变量,一个ImageView,一个TextView。(对应的我自己的listView的item,也可以变成其他的)
public final class ViewHolder{
public ImageView img;
public TextView title;
}
接下来就是viewHolder的具体存储和取出了,代码如下:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
ViewHolder holder=null;
if(convertView==null){
holder=new ViewHolder();
convertView=LayoutInflater.from(mContext).inflate(R.layout.list_item, null);
holder.img=(ImageView)convertView.findViewById(R.id.list_img);
holder.title=(TextView)convertView.findViewById(R.id.list_text);
convertView.setTag(holder);
}else{
holder=(ViewHolder)convertView.getTag();
}
holder.title.setText(mData.get(position));
return convertView;
}
上面的代码就是及两处优化在一起的代码了。
效果图如下(其实和正常的看上去没什么差别)