zoukankan      html  css  js  c++  java
  • 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了。

  • 相关阅读:
    wrap添加及去除外层dom的方法
    闭包作用域探究小例
    测试模型之W模型(脑图)
    软件测试模型之前置模型(脑图)
    软件测试模型之H模型(脑图)
    软件测试基础(脑图)
    测试模型之V模型(脑图)
    一个点型的rsyncd.conf内容
    rsync同步时报name lookup failed for name or service not known错误的解决方法
    ubuntu下的eclipse 3.3初用aptana报SWT错误
  • 原文地址:https://www.cnblogs.com/xiaoyao095/p/4913161.html
Copyright © 2011-2022 走看看