一般我们在使用ListView时,需要给ListView指定一个自定义的Adapter,其中要使用到ViewHolder来优化ListView,一般的写法是这样的:
//内部类
static class ViewHolder{
private TextView tv;
//等等一堆属性...
//提供访问和设置属性的方法
public TextView getTv(){
return tv;
};
public void setTv(TextView v){
tv=v;
}
}
//然后在你getView的方法里面这样用
@Override
public View getView(int positio,View convertView,ViewGroup parent){
if(convertView==null)[
convertView=View.inflate(getContext(),R.layout.item_list,null);
ViewHolder vh=new ViewHolder();
//给ViewHolder设置属性
vh.setTv(convertView.findViewById(R.id.tv));
convertView.setTag(vh);
}
//取出ViewHolder
ViewHolder vh=(ViewHolder)convertView.getTag();
//取出控件进行赋值
vh.getTv().setText("item"+position);
return convertView;
}
这样写一般是没什么问题的,那么当一个应用中有许多的Adapter要写的时候,需要各写一个ViewHolder。很麻烦是吧。介绍一种简洁的ViewHolder的写法(非原创):
//单独做一个通用的ViewHolder工具类
public class ViewHolder{
//提供一个静态的方法
public static <T extends View> T get(View v,int id){
//采用一个SparseArray保存键值对(SparseArray是一个简单的<int,Object>键值对保存对象)
SparseArray arr=v.getTag();
if(arr==null){
arr=new SparseArray();
//以前tag里面我们存的是ViewHolder,现在我们存的是一个SparseArraya
v.setTag(arr);
}
//获得子控件
View childView=arr.get(id);
if(childView==null){
childView=v.findViewById(id);
//SparseArraya存的是<id,View>
arr.put(id,childView);
}
return childView;
}
}
好了,使用的使用的时候简单多了
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if(convertView==null)
convertView=View.inflate(getContext(),R.layout.item_list,null);
TextView tvTitle=ViewHolder.get(convertView, R.id.tv_title);
TextView tvContent=ViewHolder.get(convertView, R.id.tv_content);
tvTitle.setText(getItem(position)+":->>>title");
tvContent.setText(getItem(position)+"->>>content");
return convertView;
}