viewholder的另一种写法

最标准的写法,就是为每一个AdapterView的子View新建一个对应的ViewHolder,同时声明为prtivate final static。

1
2
3
4
5
private final static class {
TextView name;
TextView age;
TextView sex;
}

这样的话,每次新建BaseAdapter都得新增加ViewHolder,略显麻烦。下面介绍一种惬意的书写方法,等价于官方推荐的做法。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
public class {

public static <T extends View>T get(View view,int id){
SparseArray<View> viewHolder = (SparseArray<View>)view.getTag();
if(viewHolder == null){
viewHolder = new SparseArray<View>();
view.setTag(viewHolder);
}
View childView = viewHolder.get(id);
if(childView == null){
childView = view.findViewById(id);
viewHolder.put(id,childView);
}
return (T)childView;
}
}

然后就是在BaseAdapter的getView中使用。

1
2
3
4
5
6
7
8

public View getView(int position,View convertView,ViewGroup parent){
if(convertView == null){
convertView = mInflater.inflate(R.layout.item_hotel_list,parent,false);
}
ImageView img = ViewHolder.get(convertView,R.id.item_hotel_list_img);
return convertView;
}