安卓应用系列:值得收藏的ViewHolder工具类实现

  文章来源:http://www.zretc.com/technologyDetail/459.html

  前言

  在开发APP的过程中,攻城狮少不了要跟ListView、GridView这些组件眉来眼去,暗送几波秋波。自然原生态美人BaseAdapter更是程序员的最爱,有了它,我们想怎么干就能怎么干,嘿嘿,你懂的哈哈~

  但是,每次写一个BaseAdapter,我们都很自觉的给他写一个ViewHolder,一两个还好,万一应用程序中有数不清的ListView,呵呵~你妹!千篇一律,看得都审美疲劳。作为最伟大的第二十二世纪的程序员们,脱掉、搞上永远是我们最真挚的追求,所以我们要怎么将ViewHolder从BaseAdapter中脱掉呢?绝非不是不用,而是要将其搞成一个华丽丽的工具类实现,收入角落那个寂寞得tools类中。

  ViewHolder的实现

  我觉得应该简略的介绍下ViewHolder的实现,谷歌很聪明的在Adapter中运用了复用View的思想,自然让我们的屌丝机也能泡上一些白富美应用多了一点点可能。ViewHolder的具体实现基本体现在BaseAdapter的 getView(int position, View convertView, ViewGroup parent) 这个方法里面,参见下面的代码:

  1. @Override

  2. public View getView(int position, View convertView, ViewGroup parent) {

  3. ViewHolder holder;

  4. if (convertView == null) {

  5. convertView = inflater.inflate(R.layout.listview_item_layout, parent, false);

  6. holder = new ViewHolder();

  7. holder.studentName = (TextView) convertView.findViewById(R.id.student_name);

  8. holder.studentAge = (TextView) convertView.findViewById(R.id.student_age);

  9. convertView.setTag(holder);

  10. }

  11. else {

  12. holder = (ViewHolder) convertView.getTag();

  13. }

  14. Student data = (Student) getItem(position);

  15. holder.studentName.setText(data.getName());

  16. holder.studentAge.setText(data.getAge());

  17. return convertView;

  18. }

  19.

  20. class ViewHolder {

  21. public TextView studentName;

  22. public TextView studentAge;

  23. }

  很明显,大家不要问我ViewHolder在哪里,稍微把目光往上扶一扶就看到那个大大的 class ViewHolder 。这里的ViewHolder用法主要有两个地方,一是 convertView 的复用,二是 ViewHolder 也就是 convertView 里面的索引的复用。具体的用法不熟悉的话可以百度一下,再往下说就对不起我今天这篇博文了,因为在这里写这个代码的目的,肯定不是介绍你怎么用ViewHolder,只是想告诉你:传统的ViewHolder的写法,是多么的臃肿!而且对于每一个新的BaseAdapter,你都得无聊的实现一次又一次,OH~

  ViewHolder的工具类实现

  自然,脱光要从小,行动要趁早。既然我们烦了,就把它写成一个工具类咯。参见下面的代码

  1. static class ViewHolder {

  2. public static T get(View view, int id) {

  3. SparseArray viewHolder = (SparseArray) view.getTag();

  4. if (viewHolder == null) {

  5. viewHolder = new SparseArray();

  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. }

  15. }

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

  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;

  14. }

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

  分析可行性

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

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

  易用性:工具类的最大特性就是易用简约,这个ViewHolder的写法就是典型的拿来就用的主义,根本不用我们操心写些适配的代码,直接传入View和id,高内聚松耦合。并且采用了 T的泛型模板的方法,自动与外部的View子类适配,不用我们手动去强制装换。

  内存泄露:有些初学者,看到static方法就回固执的认为 SparseArray viewHolder 这个变量会存在内存泄露,但是java告诉我们,这个变量的小命仅仅在方法执行之中,方法完毕,GC回收;存在ViewHolder一如既往放在View的Tag中,一旦View被回收,ViewHolder自然消失。不信,打开DDMS,用你28青年的手速不停刷listView试试,保证对象基本稳定在一个值。

  性能提升:在这里我们发现用了 SparseArray 这个集合而不是 HashMap ,我们知道 SparseArray 是Android的一个工具类,是官方推荐用来代替 HashMap 的一个类,它的内部采用了二分查找的实现提高了查找效率,而且不是一点两点的哦,谁用谁知道;具体内容想要了解,可以度娘谷哥或者左转源码。

  所以,作为一个工具类,它是完全合格的,赶紧把它拷贝到你的tools、util里面,然后我们就可以开心加愉悦的优雅用起ViewHolder了。

  了解更多Android开发入门知识、工具应用、编码规则等等欢迎访问中软国际教育集团技术知识库!

时间: 2024-10-14 20:31:03

安卓应用系列:值得收藏的ViewHolder工具类实现的相关文章

Android应用系列:值得收藏的ViewHolder工具类实现

前言 在开发APP的过程中,攻城狮少不了要跟ListView.GridView这些组件眉来眼去,暗送几波秋波.自然原生态美人BaseAdapter更是程序员的最爱,有了它,我们想怎么干就能怎么干,嘿嘿,你懂的O(∩_∩)O哈哈~ 但是,每次写一个BaseAdapter,我们都很自觉的给他写一个ViewHolder,一两个还好,万一应用程序中有数不清的ListView,呵呵~你妹!千篇一律,看得都审美疲劳.作为最伟大的第二十二世纪的程序员们,脱掉.搞上永远是我们最真挚的追求,所以我们要怎么将Vie

安卓开发技巧二:自定义日志工具类XLog的实现

我们在开发过程中,打印日志是必不可少的一个调试环节,然而,直接使用系统自带的Log日志类,并不能满足我们实际项目的需求:假如我们现在在开发一款比较大的项目,用到打印日志的地方肯定特别多,等到真正上线的时候,我们是不希望日志依旧能够打印出的,原因很简单,不仅多少有些影响效率,更有可能导致信息的泄露,所以我们就需要把所有的日志打印语句全部取消掉,难道我们真的一个一个的去删除这些打印日志的语句吗?项目那么大,就是想删除,也得耗费大量的时间和精力!大家不用怕,笔者这就给大家带来一款控制线上版本和线下版本

Java并发编程系列-(2) 线程的并发工具类

2.线程的并发工具类 2.1 Fork-Join JDK 7中引入了fork-join框架,专门来解决计算密集型的任务.可以将一个大任务,拆分成若干个小任务,如下图所示: Fork-Join框架利用了分而治之的思想:什么是分而治之?规模为N的问题,N<阈值,直接解决,N>阈值,将N分解为K个小规模子问题,子问题互相对立,与原问题形式相同,将子问题的解合并得到原问题的解. 具体使用中,需要向ForkJoinPool线程池提交一个ForkJoinTask任务.ForkJoinTask任务有两个重要

mac设计师系列 Adobe “全家桶” 15款设计软件 值得收藏!

文章素材来源:风云社区.简书 文章收录于:风云社区 www.scoee.com,提供1700多款mac软件下载 Adobe Creative Cloud 全线产品均可开放下载(简称Adobe CC 全家桶),Adobe Creative Cloud 为多国语言版本,支持:中文,英文,韩文,日本等多国语言, 在安装的时候可以选择自己需要的语言安装. 下面,给大家简单介绍一下adobe全家桶. 1.Photoshop Adobe Photoshop,简称“PS”,是一个由Adobe Systems开

创业的态度 值得收藏

本文来自First Round Review,他们准备的文章既讲故事,还同时向创业者提供可操作的建议,以助力打造优秀的公司.在最初创立的时候,Squarespace只是Anthony Casalena为自己搞的个人网站,在Wordpress和Drupal面前,它不值一提.今天,它已然崛起,累计融资达7850万美元.用了对的方法,解决了对的问题,它于是逐渐壮大成了今天的样子... Squarespace 的最初版本只是 Anthony Casalena 为自己搞的个人网站.这是一个普通的创业故事.

【Java并发编程】并发编程大合集-值得收藏

http://blog.csdn.net/ns_code/article/details/17539599这个博主的关于java并发编程系列很不错,值得收藏. 为了方便各位网友学习以及方便自己复习之用,将Java并发编程系列内容系列内容按照由浅入深的学习顺序总结如下,点击相应的标题即可跳转到对应的文章    [Java并发编程]实现多线程的两种方法    [Java并发编程]线程的中断    [Java并发编程]正确挂起.恢复.终止线程    [Java并发编程]守护线程和线程阻塞    [Ja

Windows CMD命令大全(值得收藏)

您的位置:首页 → 脚本专栏 → DOS/BAT → 正文内容 CMD命令大全 Windows CMD命令大全(值得收藏) 更新时间:2018年06月06日 13:04:33   投稿:mdxy-dxy   我要评论 虽然随着计算机产业的发展,Windows 操作系统的应用越来越广泛,DOS 面临着被淘汰的命运,但是因为它运行安全.稳定,有的用户还在使用,所以一般Windows 的各种版本都与其兼容,用户可以在Windows 系统下运行DOS等 命令简介 cmd是command的缩写.即命令行

程序员带你学习安卓开发系列-Android文件存储

这是程序员带你学习安卓开发系列教程.本文章致力于面向对象程序员可以快速学习开发安卓技术. 上篇文章:.Net程序员快速学习安卓开发-布局和点击事件的写法 主要讲解了布局和点击事件的写法. 上篇文章补充: 控件单位介绍: px 像素 dip或者dp 设备独立像素 sp 比例像素 控件的高度宽度一般用dip或者dp.字体用sp. Android 存储数据项目: 描述:实现QQ登录效果.如图: 输入帐号密码,并勾选记住帐号 ,点击登录时,保存帐号信息.下次登陆可以直接显示上次保存的QQ帐号. 前台界面

21个值得收藏的javas技巧

在本文中列出了21个值得收藏的Javascript技巧,在实际工作中,如果能适当运用,则大大提高工作效率. 1 Javascript数组转换为CSV格式 首先考虑如下的应用场景,有一个Javscript的字符型(或者数值型)数组,现在需要转换为以逗号分割的CSV格式文件.则我们可以使用如下的小技巧,代码如下: var fruits = ['apple', 'peaches', 'oranges', 'mangoes']; var str = fruits.valueOf(); 输出:apple,