ViewHolder模式超简洁写法

ViewHolder是什么就不解释了。
大家通常怎么写ViewHolder呢?

        ViewHolder holder = null;
        if(convertView == null){
                convertView = 

mInflater.inflate(R.layout.xxx null);
                holder = new 

ViewHolder();
                holder.tvXXX 

= (TextView)findViewById(R.id.xxx);
                //...一连串的

findViewById
        }
        else{
                holder = 

(ViewHolder) convertView.getTag();  
        }
         
         
         
        private static class ViewHolder{
                TextView 

tvXXX;
                //很多view的

定义
        }

这么写一次还行,但问题是总有很多很多的ViewAdapter要这么写,每次都

repeat,repeat,repeat 累啊。 所以,有这么一种简洁的写法分享给大家,先声明,从国

外网站上看的,不是自己原创的,但确实很喜欢这个简洁的设计。
ViewHolder这么写(只提供一个静态方法,其实可以加一个私有构造函数防止外部实例化),代

码很简单,看过就明白了

public class ViewHolder {
    // I added a generic return type to reduce the casting noise in 

client code
    @SuppressWarnings("unchecked")
    public static  T get(View view, int id) {
        SparseArray viewHolder = 

(SparseArray) view.getTag();
        if (viewHolder == null) {
            viewHolder = new 

SparseArray();
            view.setTag(viewHolder);
        }
        View childView = viewHolder.get(id);
        if (childView == null) {
            childView = 

view.findViewById(id);
            viewHolder.put(id, 

childView);
        }
        return (T) childView;
    }
}

在getView里这样

@Override
public View getView(int position, View convertView, ViewGroup parent) {
 
    if (convertView == null) {
        convertView = LayoutInflater.from

(context)
          .inflate(R.layout.banana_phone, parent, 

false);
    }
 
    ImageView bananaView = ViewHolder.get(convertView, R.id.banana);
    TextView phoneView = ViewHolder.get(convertView, R.id.phone);
 
    BananaPhone bananaPhone = getItem(position);
    phoneView.setText(bananaPhone.getPhone());
    bananaView.setImageResource(bananaPhone.getBanana());
 
    return convertView;
}

哈哈,完成了,果断把这个ViewHolder类加入自己的utils,一劳永逸了以后~
值得注意的是SparseArray这个知识点,优化过的存储integer和object键值对的hashmap,网上

资料很多这里就不废话了~

时间: 2024-10-27 02:16:02

ViewHolder模式超简洁写法的相关文章

ViewHolder模式超简洁写法,很cool!

转自http://www.eoeandroid.com/forum.php?mod=viewthread&tid=321547&page=3#pid3555274 ViewHolder是什么就不解释了.         大家通常怎么写ViewHolder呢? 01         ViewHolder holder =null; 02         if(convertView ==null){ 03                 convertView = mInflater.inf

Android 通过ViewHolder优化适配器的实现方法(必看)

Adapter类的定义: Adapter对象是AdapterView和底层数据见的桥梁.Adapter用于访问数据项,并且负责为数据项生成视图 AdapterView是一个抽象类,用于那些需要通过Adapter填充自身的视图,其常见子类是ListView.显示AdapterView时会调用Adapter的getView()方法创建并添加每个子条目的视图.Adapter的getView()方法就是用来创建这些视图的,Adapter并不会为每行数据都创建一个新视图,而是提供了回收旧视图的方法.运行机

Android ListView之EfficientAdapte的使用详解

Android ListView之EfficientAdapte的使用详解 在做Android手机应用开发时, ListView是一个非常常用的控件.如何更新的使用它呢?其实SDK中的例子已经非常的完整了,并且能满足大多数的需要. 如果大家刚开始学习ListView,我建议大家还是直接先看官方的例子好了,这样大家会学到更好的写法以及养成更好的习惯. 下面就以EfficientAdapter为例,看看官网例子是如何使用ListView的: 请大家格外注意getView的书写方法,大家可能从网上也能

Android自定义View——自定义搜索框(SearchView)

概述 在Android开发中,当系统数据项比较多时,常常会在app添加搜索功能,方便用户能快速获得需要的数据.搜索栏对于我们并不陌生,在许多app都能见到它,比如豌豆荚 在某些情况下,我们希望我们的自动补全信息可以不只是纯文本,还可以像豌豆荚这样,能显示相应的图片和其他数据信息,因此Android给我们提供的AutoCompleteTextView往往就不够用,在大多情况下我们都需要自己去实现搜索框. 分析 根据上面这张图,简单分析一下自定义搜索框的结构与功能,有  1. 搜索界面大致由三部门组

那年的RecyclerView我们从头撸一下

本文讲的是那年的RecyclerView我们从头撸一下,根据Google官方给出的说明:A flexible view for providing a limited window into a large data set.能够在有限的窗口中展示大数据集合的灵活视图. 所以我们能够理解为,RecyclerView的一个恰当的使用场景是:由于尺寸限制,用户的设备不能一次性展现所有条目,用户需要上下滚动以查看更多条目.滚出可见区域的条目将被回收,并在下一个条目可见的时候被复用. 对于减少内存开销和

Java多线程与并发库高级应用

想快速精通多线程?看这里  http://blog.chinaunix.net/uid-540802-id-4431193.html 什么是线程         线程,是程序执行流的最小单元.是进程中的一个实体,是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可以与同属一个进程的其他线程共享进程所拥有的全部资源,一个线程可以创建和撤销另一个线程,同一进程中的多个线程之间可以并发执行.在单个程序中同时运行多个线程完成不同的工作,称为多线程.当自己想

Android群英传笔记——第四章:ListView使用技巧

Android群英传笔记--第四章:ListView使用技巧 最近也是比较迷茫,但是有一点点还是要坚持的,就是学习了,最近离职了,今天也是继续温习第四章ListView,也拖了其实也挺久的了,listview可谓是老牌大将了,很多的应用场景都要使用它,他也是我们用得最多的控件之一了,虽然现在出来了一个RecyclerView,但是ListView的地位一时半会儿还是撼动不了的,这就促使我们更加应该去把他掌握了 一.Listview常用优化技巧 我们一步步来把ListView学习好 1.使用Vie

《 Java并发编程从入门到精通》目录和序言

目 录 第一部分:线程并发基础   第1章 概念部分   1 1.1 CPU核心数.线程数 (主流cpu,线程数的大体情况说一下) 1 1.2 CPU时间片轮转机制 2 1.3 什么是进程和什么是线程 4 1.4 进程和线程的比较 5 1.5 什么是并行运行 7 1.6 什么是多并发运行 8 1.7 什么是吞吐量 9 1.8  多并发编程的意义及其好处和注意事项 10 1.9  分布式与并发运算关系 11 1.10 Linux和Window多并发可以采取不的一样机制(apache和tomcat?

Spark-SparkSQL深入学习系列二(转自OopsOutOfMemory)

   /** Spark SQL源码分析系列文章*/     Spark SQL的核心执行流程我们已经分析完毕,可以参见Spark SQL核心执行流程,下面我们来分析执行流程中各个核心组件的工作职责.     本文先从入口开始分析,即如何解析SQL文本生成逻辑计划的,主要设计的核心组件式SqlParser是一个SQL语言的解析器,用scala实现的Parser将解析的结果封装为Catalyst TreeNode ,关于Catalyst这个框架后续文章会介绍. 一.SQL Parser入口