ViewHolder工具类

ViewHolder的工具类实现

参见下面的代码

 
 
  1. static class ViewHolder { 
  2.     public static <T extends View> T get(View view, int id) { 
  3.         SparseArray<View> viewHolder = (SparseArray<View>) view.getTag(); 
  4.         if (viewHolder == null) { 
  5.             viewHolder = new SparseArray<View>(); 
  6.             view.setTag(viewHolder); 
  7.         } 
  8.         View childView = viewHolder.get(id); 
  9.         if (childView == null) { 
  10.             childView = view.findViewById(id); 
  11.             viewHolder.put(id, childView); 
  12.         } 
  13.         return (T) childView; 
  14.     } 

这是工具类的实现,稍微说下实现的原理:

1、ViewHolder既然是依赖View的Tag存放,但是以一个 SparseArray 集合存放。

2、判断View里的Tag是否存在viewHolder,不存在,赶紧叫她生一个。

3、然后在viewholder(也就是SparseArray)寻找View的索引,如果没有,赶紧findViewById一个put进去顺便return出来,如果已经存在,皆大欢喜,直接用呗。

贴个BaseAdapter里面使用的代码:

 
 
  1. @Override 
  2. public View getView(int position, View convertView, ViewGroup parent) { 
  3.     if (convertView == null) { 
  4.         convertView = inflater.inflate(R.layout.listview_item_layout, parent, false); 
  5.     } 
  6.     TextView name = Tools.ViewHolder.get(convertView, R.id.student_name); 
  7.     TextView age = Tools.ViewHolder.get(convertView, R.id.student_age); 
  8.      
  9.     Student data = (Student) getItem(position); 
  10.     name.setText(data.getName()); 
  11.     age.setText(data.getAge()); 
  12.      
  13.     return convertView; 

简洁明了,不用多说~~~嘿嘿,后面如果要写ViewHolder,直接Tools工具类调用,省心不废脑。。

分析可行性

既然要作为工具类使用,我们有必要先评估这个工具值不值得我们使用。

一般来说,我们可以从以下几个方面进行评估:易用性? 内存泄露? 性能提升? 健壮性?等等等。。。。。。

易用性:工具类的最大特性就是易用简约,这个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> 的一个类,它的内部采用了二分查找的实现提高了查找效率,而且不是一点两点的哦,谁用谁知道;具体内容想要了解,可以度娘谷哥或者左转源码。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值