ViewHolder的工具类实现:
1 package com.xxxx.xxx.utils; 2 3 import android.util.SparseArray; 4 import android.view.View; 5 6 /** 7 * ViewHolder:公共方法 8 * 9 * @author leict 10 * 11 */ 12 public class Tools { 13 /** 14 * 公共方法 15 * 16 * @author leict 17 * 18 */ 19 public static class ViewHolder { 20 21 @SuppressWarnings("unchecked") 22 public static <T extends View> T get(View view, int id) { 23 SparseArray<View> viewHolder = (SparseArray<View>) view.getTag(); 24 if (viewHolder == null) { 25 viewHolder = new SparseArray<View>(); 26 view.setTag(viewHolder); 27 } 28 View childView = viewHolder.get(id); 29 if (childView == null) { 30 childView = view.findViewById(id); 31 viewHolder.put(id, childView); 32 } 33 return (T) childView; 34 } 35 } 36 }
BaseAdapter里面使用的代码:
1 @Override 2 public View getView(int position, View view, ViewGroup parent) { 3 final WorksEntity entity = (WorksEntity) itemList.get(position); 4 if (entity == null) 5 return null; 6 if (view == null) { 7 view = inflater.inflate(R.layout.item_complaint_person, null); 8 } 9 TextView title = Tools.ViewHolder.get(view, R.id.Case_name); 10 TextView addtime = Tools.ViewHolder.get(view, R.id.Case_date); 11 TextView state = Tools.ViewHolder.get(view, R.id.Case_state); 12 TextView type = Tools.ViewHolder.get(view, R.id.Case_type); 13 title.setText(entity.getTitle()); 14 addtime.setText(entity.getAddtime()); 15 state.setText(entity.getState()); 16 type.setText(entity.getType()); 17 return view; 18 }
分析可行性:
既然要作为工具类使用,我们有必要先评估这个工具值不值得我们使用。
一般来说,我们可以从以下几个方面进行评估:易用性? 内存泄露? 性能提升? 健壮性?等等等。。。。。。
易用性:工具类的最大特性就是易用简约,这个ViewHolder的写法就是典型的拿来就用的主义,根本不用我们操心写些适配的代码,直接传入View和id,高内聚松耦合。并且采用了<T extends View> T的泛型模板的方法,自动与外部的View子类适配,不用我们手动去强制装换。
内存泄露:有些初学者,看到static方法就回固执的认为 SparseArray<View> viewHolder 这个变量会存在内存泄露,但是java告诉我们,这个变量的小命仅仅在方法执行之中,方法完毕,GC回收;存在ViewHolder一如既往放在View的Tag中,一旦View被回收,ViewHolder自然消失。不信,打开DDMS,用你28青年的手速不停刷listView试试,保证对象基本稳定在一个值。
性能提升:在这里我们发现用了 SparseArray 这个集合而不是 HashMap ,我们知道 SparseArray 是Android的一个工具类,是官方推荐用来代替 HashMap<Integer,E> 的一个类,它的内部采用了二分查找的实现提高了查找效率,而且不是一点两点的哦,谁用谁知道;具体内容想要了解,可以度娘谷哥或者左转源码。
所以,作为一个工具类,它是完全合格的,赶紧把它拷贝到你的tools、util里面,然后我们就可以开心加愉悦的优雅用起ViewHolder了。