1 import android.util.SparseArray;
2 import android.view.View;
3
4 /**
5 * 封装了setTag()和getTag()方法
6 * 封装了findViewById()方法
7 * ViewHolder为ListView的每个条目打上tag,
8 * 这个tag是一个数组对象,里面存储每个条目所包含的子控件对象,key为资源id
9 * 当listview滑出顶部时,最上面的条目(convertView)被回收
10 * 最下面需要显示的条目就不需要再用父容器去找子控件(耗时操作),
11 * 而是直接取得父容器的tag,在tag中获取到子控件对象
12 *
13 *
14 */
15 public class ViewHolder {
16 /**
17 *
18 *
19 *
20 * @param view
21 * 控件父容器对象
22 * @param id
23 * 控件id
24 * @return 控件对象
25 */
26 @SuppressWarnings("unchecked")
27 public static <T extends View> T get(View view, int id) {
28 // 如果父容器不为空,获取父容器的tag,为数组初始化............
29 SparseArray<View> viewHolder = (SparseArray<View>) view.getTag();
30 if (viewHolder == null) {
31 // 如果数组为空,新建数组
32 viewHolder = new SparseArray<View>();
33 // 将父容器打上数组的tag...............
34 view.setTag(viewHolder);
35 }
36 // 根据控件的资源id在数组中找控件
37 View childView = viewHolder.get(id);
38 // 如果控件为空
39 if (childView == null) {
40 // 在父容器找
41 childView = view.findViewById(id);
42 // 将控件的资源id和控件对象存到数组中
43 viewHolder.put(id, childView);
44 }
45 // 返回子控件
46 return (T) childView;
47 }
48 }