文档章节

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

artshell
 artshell
发布于 2014/09/27 22:34
字数 899
阅读 72
收藏 0

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 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,网上资料很多这里就不废话了~

------------------------------------------原帖中的部分评论-------------------------------------------------

#lixiao000013

最简洁的写法是不写ViewHolder  使用SimpleAdapter或者SimpleCursorAdapter  重写 bindView

-------------------------------------------------------------------------------

#zhugogogo

楼主解释一下,会不会造成内存泄露。。。。。那样的话就没有意思了。。。。

泄露?memory leak? 不会啊,你说的可能是oom, out of memory吧?

其实这种写法本质和ViewHolder Partten没有什么不同,ViewHolder Partten是把一个自定义类绑定到一个view,这种是把SparseArray绑定到一个view,虽然SparseArray 初始化会分配10长度的地址,理论上貌似浪费了内存,理论上插入和删除操作也是有时间损耗的,但是这些都在允许范围内。

比如https://github.com/JoanZapata/base-adapter-helper 作者也说了他做了大量测试,这种损耗微乎其微。

再次,万一万一因特殊情况发现了有性能瓶颈,到时候再优化就可以了,但是绝大多数场合都是可以使用的,大量简化你的开发,加快开发速度,代码少了,出错的几率就小了,维护的成本也小了~好处还是大大的。

https://github.com/JoanZapata/base-adapter-helper 这个项目在我正文贴出的代码基础上进一步封装了许多实用的功能,更cool哦~ 可以下载好好研究一下~

1、引入了SparseArray,那样的话,列表每一项都多了一个SparseArray,这种集合类型内部成员变量都很 ...

简单的纸上分析~:
(1)ViewHolder Pattern是每一个View一个ViewHolder,里面是记录listitem内控件引用; SparseArray是记录id和控件引用的键值对,当然SparseArray初始化会分配一定地址空间(默认是10),但是这些内存损耗应该是可以忽略的~
(2)SparseArray是优化过的int-object的hashmap,使用折半查找,并优化了内存分配,所以代码执行成本通常是可控的。

综上,使用SparseArray与ViewHolder相比是有损耗,但应该是可控的。使用SparseArray优点是加快开发速度和减少代码维护,当发现有性能瓶颈时,再进行优化~

本文转载自:http://www.eoeandroid.com/thread-321547-1-1.html

共有 人打赏支持
artshell
粉丝 2
博文 56
码字总数 5163
作品 0
成都
程序员
私信 提问
viewholder 简洁写法

ViewHolder是什么就不解释了。 大家通常怎么写ViewHolder呢? 这么写一次还行,但问题是总有很多很多的ViewAdapter要这么写,每次都repeat,repeat,repeat 累啊。 所以,有这么一种简洁的写法...

郑泮勇
2016/05/21
26
0
ViewHolder模式超简洁写法,酷到没朋友!!!

继上一篇放大招了!基于Bmob的Android即时通讯应用源码 (一) 用到的ViewHolder viewHolder 就不解释了,懂的人都懂!!!不懂就问度娘!!! 废话不多说,进入正题!!! 大家通常怎么写V...

谁带我去看看世界
2015/05/25
0
3
Android的viewHolder模式

深入浅出(这部分总结的非常好) ListView之BaseAdapter的基本使用以及ViewHolder模式。 话说开发用了各种Adapter之后感觉用的最舒服的还是BaseAdapter,尽管使用起来比其他适配器有些麻烦,...

xiaole0313
2016/08/16
0
0
Android ViewHolder简洁写法及替代findViewById方法

ViewHolder简洁写法,避免适配器中重复定义ViewHolder: import android.util.SparseArray;import android.view.View; @SuppressWarnings({"unchecked"})public class ViewFindUtils { /** *......

SRain215
2016/02/19
127
1
放大招了!基于Bmob的Android即时通讯应用源码 (一)

今天给大家分享系列干货:基于Bmob的Android即时通讯应用源码。目前Android端已更新到V1.1.1版本。IOS端已推出V1.0.1版本。 以后将持续更新,分享源码!! 脚的好就多多回复 一、已实现功能:...

谁带我去看看世界
2015/05/22
0
4

没有更多内容

加载失败,请刷新页面

加载更多

聊聊flink TableEnvironment的scan操作

序 本文主要研究一下flink TableEnvironment的scan操作 实例 //Scanning a directly registered tableval tab: Table = tableEnv.scan("tableName")//Scanning a table from a registered......

go4it
22分钟前
2
0
JS检测移动端横竖屏的代码

移动端的设备提供了一个事件:orientationChange事件 这个事件是苹果公司为safari中添加的。以便开发人员能够确定用户何时将设备由横向查看切换为纵向查看模式。 在设备旋转的时候,会触发这...

不负好时光
22分钟前
2
0
ArrayList 优化

优化是 基于数据的大小 当数据量过大 (内存能抗住) 性能达到瓶颈才需要针对性的做优化 contain 优化 可以转换为set add 大批量操作 先预估数据量 调用 `ensureCapacity(int minCapacity)` ...

NotFound403
24分钟前
3
0
Lifecycle Aware Data Loading with Architecture Components

In my previous blog post, I talked about how you can use Loaders to load data in a way that automatically handles configuration changes. With the introduction of Architecture Co......

SuShine
24分钟前
1
0
性能测试汇总

服务器带宽测试 iperf测试带宽 wget -c https://codeload.github.com/esnet/iperf/tar.gz/3.1.6 tar zxvf 3.1.6cd iperf*yum install gcc./configure --prefix=/usr/local/iperf#指定......

以谁为师
28分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部