如何高效的使用适配器Adapter

如何高效的使用适配器Adapter

   当我们在使用ListView、GridView时,都会给其设置相应的适配器,用来给其设置数据,会去继承BaseAdapter,重写getCount()、  getItem(  
   int position)、getItemId(int position)以及getView(int position, View convertView,   ViewGroup parent)四个方法,我们   
   最关心的就只是两个方法,一个是getCount(),一个是getView(int position,   View convertView, ViewGroup parent)。在getView  
   方法中,convertView就是用来给界面返回View对象的参数。

    我们在初学Adapter时,通常会像如下的方式来写getView方法

初学Adapter的getView写法

这样编写的代码确实简单易懂,但是大家忽略掉了一个问题。每创建一个View对象,getView方法就会调用一次,如果设置的getCount方法的返回的  
个数很多,例如5000个,如果使用这种编写方法,当我们快速滑动ListView时,就会有可能会发生ANR现象(Application Not Responding),  
同时也可能并发出现OOM的问题,出现这些个情况是每一个安卓开发者的大忌,所以为了避免出现上述问题,就需要对当前的方法进行优化。

   在安卓中,google工程师考虑到了会出现这种情况,所以在重写getView方法时,将convertView给我们传递了过来,我们需要利用这个  
   convertView参数,利用安卓中的回收机制,来提高使用适配器的使用效率。

使用convertView写的getView方法

通过这样修改以后,程序的性能会相比之前提高了很多。但是,但是,但是,重要的事情说三遍,我们这样做还是远远不够的。我们仅仅只是把  
没有引用的convertView重新利用起来,还是没有达到提高程序运行效率的结果,所以我们对于刚才写的代码还需要改进。所以出现了  
ViewHolder。很多人不知道ViewHolder怎么来的,其实是自己定义来的,哈哈。这会你肯定在心里想,我也知道是自己定义的,但是  
是用来干嘛的呢? 好吧, 我就献丑给大家说说吧。ViewHolder是自己定义的,你也可以定义成你喜欢的名,ViewHolder是为了让大  
家顾名思义。ViewHolder最普遍就是出现在适配器里,为的是当listview滚动的时候快速设置值,而不必每次都重新创建很多对象,  
从而来提升程序的性能。这会你懂了吧。所以,我们需要将上面的代码修改成下面这样:

使用ViewHolder

   在这段代码中,关键点是要给 convertView设置标签,就是convertView.setTag的方法,因为只有设置了这个方法,原来创建了  
   的View对象才能进行复用,这样才能提升程序的运行效率。ViewHolder将需要缓存界面数据的view封装好,convertView的setTag  
   才是将这些缓存起来供下次调用。当然,我们现在设置的布局没有那么复杂,也许你感觉不到他的好处,当你使用完成复杂的界面,需要添  
   加适配器时,你才会感觉的它的好,我相信你会爱上它的。

   可能您发现了,我们在改进这个代码的时候,效率确实是提升了不少,但是出现了一个问题,为了演示,我这点仅仅是用了两个组件,  
   但是如果我们的条目中如果有三个、四个、五个获取更多的时候呢?  就findViewById就够我们写一段时间了,哪还有心情去写其  
   他的代码。不过不用担心,当我们在烦恼这个问题的时候,大神们已经为我们想到的问题给出了解决方法。在github上,给我们提供了一个方便的框架

base-adapter-helper

对,就是它,没错,它完美的解决了我们面临的问题。这篇文章中将其使用方法罗列出来,
它的设计思想是使用了 SparseArray来存储view的引用,从而来替代了原本的ViewHolder,不用再声明一大堆View。

使用SparseArray来创建高效ViewHolder,提升程序性能。

第一次写博客,我是一个菜鸟,写博客呢,不是为了说明什么。只是想记录自己从小白一路走过的经历,自己成长的过程,想多年
以后回想起来的时候,感谢现在正在努力的自己。谢谢,不喜勿喷,如果你有更好的想法,我们一起交流,我也想像你一样,成为一个大神~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值