文档章节

viewholder 简洁写法

郑泮勇
 郑泮勇
发布于 2016/05/21 11:53
字数 416
阅读 34
收藏 4

行业解决方案、产品招募中!想赚钱就来传!>>>

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 {
    @SuppressWarnings("unchecked")
    public static <T extends View> T get(View view, int id) {
        SparseArray<View> viewHolder = (SparseArray<View>) view.getTag();
        if (viewHolder == null) {
            viewHolder = new SparseArray<View>();
            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,网上资料很多这里就不废话了~
 

分享一个github上的开源项目小工具,更cool更简洁! 核心同样是使用SparseArray存储id+view,但更巧妙的是使用Builder模式进一步封装了常用的控件方法,进一步简化了代码~
地址是  https://github.com/JoanZapata/base-adapter-helper 
 
郑泮勇
粉丝 2
博文 42
码字总数 5348
作品 0
温州
程序员
私信 提问
加载中
请先登录后再评论。
Swing界面分析和调试工具--Swing Inspector

Swing Inspector是一个Java Swing/AWT用户界面分析和调试工具,功能与firebug类似,具有强大的Swing/AWT用户界面分析和调试相关功能。 适用于从java swing初级到高级的所有开发人员,能够快速...

匿名
2013/03/06
3.4K
0
PHP博客系统--WBlog

Wblog是一个基于thinkphp3.1框架开发的轻量级的简洁实用的PHP博客系统,倡导“大道至简,开发由我”的理念,用最少的代码完成更多的功能。更多功能仍在完善中。。。 目前主要功能:   主博...

匿名
2012/11/02
2.9K
0
SAE/CloudFoundry 个人独立博客--Blog4j

Blog4j是一个用Java实现的, 简洁的, 高效的个人独立博客. 没有使用臃肿的SSH流, 但自己构建了一个简洁高效的替代者--Run框架, 使博客运行达到最高性能, 最低耗能! 特点: 文章分类基于标签形式...

xwz
2012/12/14
9.6K
5
JavaScript 模版引擎--JsHtml

JsHtml 提供简洁的 HTML、全 JavaScript 的模版引擎,灵感来自 ASP.NET MVC 中的 razor 视图引擎。可在浏览器使用,也支持 Node.js 。 示例模版 index.jshtml:...

匿名
2012/12/19
1.8K
0
统一数据库访问接口--edbc

edbc 是 Emacs-Lisp Database Connectivity 的缩 写 ,是从 Emacs-CGI 项目中独立出来的一个子项目,为 Emacs Lisp 访问数据库提供简洁、统一的接口! 在其他语言(比如Java)中访问数据库,...

redraiment
2012/12/26
1.6K
0

没有更多内容

加载失败,请刷新页面

加载更多

数据库高频面试点,事务/乐观锁/悲观锁/CAS/MySQL存储引擎

事务的ACID特性是什么? 原子性: 事务是最小的执行单位,不允许分割。事务的原子性确保动作要么全部完成,要么完全不起作用; 一致性: 执行事务前后,数据保持一致,多个事务对同一个数据读...

osc_45536bvu
32分钟前
16
0
大数据BI软件助力企业数字化转型

当下,「新基建」势头正盛,随着“新基建”成为热议话题,数字化也随之成为企业面临的新机遇和新挑战。新基建的核心就是数据,数据是数字经济和企业数字化转型的生产要素和发展动力。 再看看...

osc_0boqdoe2
33分钟前
0
0
凯旋创投来志刚:基因治疗新时代,大戏刚刚开始

  2017 年,全球第一个基因治疗方法 CAR-T 细胞药物 Kymriah 获得 FDA 上市批准,从此掀起了基因治疗的热潮。随着相关技术和政策的不断成熟,基因治疗市场也随之扩大。根据德勤发布的《引领...

osc_k3vwonkw
35分钟前
10
0
LightningChart.NET使用两个BarSeries创建简单的2D图表

本教程介绍了如何使用两个BarSeries创建简单的2D图表。 BarSeries将数据值表示为矩形条,并且可以用于以非常清晰的方式可视化数据之间的差异和方差。 在本教程中,BarSeries用于表示两年期间...

roffey
35分钟前
0
0
Mybatis trim 标签的 2 个妙用!

云栖号资讯:【点击查看更多行业资讯】 在这里您可以找到不同行业的第一手的上云资讯,还在等什么,快来! mybatis的trim标签一般用于去除sql语句中多余的and关键字,逗号,或者给sql语句前拼...

osc_x03qsedc
36分钟前
10
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部