专栏名称: 安卓开发精选
伯乐在线旗下账号,分享安卓应用相关内容,包括:安卓应用开发、设计和动态等。
目录
相关文章推荐
开发者全社区  ·  山东相亲食物链:码农沦为底层 ·  3 小时前  
开发者全社区  ·  昔日同学中的三好学生都翻车了 ·  11 小时前  
开发者全社区  ·  ​金融行业是真不行了​ ·  昨天  
开发者全社区  ·  华科大老师的公积金!! ·  2 天前  
开发者全社区  ·  北舞身材管理曝光 ·  3 天前  
51好读  ›  专栏  ›  安卓开发精选

值得收藏的 ViewHolder 工具类实现

安卓开发精选  · 公众号  · android  · 2016-12-31 21:57

正文

(点击 上方公众号 ,可快速关注)


来源:enjoy风铃

链接:www.cnblogs.com/net168/p/4477925.html

如有好文章投稿,请点击 → 这里了解详情


前言


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


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


ViewHolder的实现


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


@Override

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

ViewHolder holder ;

if ( convertView == null ) {

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

holder = new ViewHolder ();

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

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

convertView . setTag ( holder );

}

else {

holder = ( ViewHolder ) convertView . getTag ();

}

Student data = ( Student ) getItem ( position );

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

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

return convertView ;

}

class ViewHolder {

public TextView studentName ;

public TextView studentAge ;

}


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


ViewHolder的工具类实现


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


static class ViewHolder {

public static T extends View > 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 ;

}

}


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


1、ViewHolder既然是依赖View的Tag存放,但是以一个 SparseArray 集合存放。


2、判断View里的Tag是否存在viewHolder,不存在,赶紧叫她生一个。


3、然后在viewholder(也就是SparseArray)寻找View的索引,如果没有,赶紧findViewById一个put进去顺便return出来,如果已经存在,皆大欢喜,直接用呗。


贴个BaseAdapter里面使用的代码:


@Override

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

if







请到「今天看啥」查看全文


推荐文章
开发者全社区  ·  山东相亲食物链:码农沦为底层
3 小时前
开发者全社区  ·  昔日同学中的三好学生都翻车了
11 小时前
开发者全社区  ·  ​金融行业是真不行了​
昨天
开发者全社区  ·  华科大老师的公积金!!
2 天前
开发者全社区  ·  北舞身材管理曝光
3 天前
界面新闻  ·  视频 | 法治的力量
7 年前
科学解码  ·  青蛙粘液中发现抗流感的成分!
7 年前