Android ViewHolder的工具类实现

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了。

原文地址:https://www.cnblogs.com/xiaoyao095/p/4913161.html