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

  • 相关阅读:
    024 Go语言基础之文件操作
    023 Go语言标准库之log
    022 Go语言标准库之flag
    021 Go语言标准库之time
    019 Go语言基础之单元测试
    020 Go语言标准库之fmt
    数据导出为Excel(未完)
    .net+EF+mvc通过EasyUI的DataGrid实现增删改查
    EasyUI入门,DataGrid(数据表格)
    基于jQuery的用户界面插件集合---EasyUI
  • 原文地址:https://www.cnblogs.com/xiaoyao095/p/4913161.html
Copyright © 2020-2023  润新知