如何高效的使用适配器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方法
这样编写的代码确实简单易懂,但是大家忽略掉了一个问题。每创建一个View对象,getView方法就会调用一次,如果设置的getCount方法的返回的
个数很多,例如5000个,如果使用这种编写方法,当我们快速滑动ListView时,就会有可能会发生ANR现象(Application Not Responding),
同时也可能并发出现OOM的问题,出现这些个情况是每一个安卓开发者的大忌,所以为了避免出现上述问题,就需要对当前的方法进行优化。
在安卓中,google工程师考虑到了会出现这种情况,所以在重写getView方法时,将convertView给我们传递了过来,我们需要利用这个
convertView参数,利用安卓中的回收机制,来提高使用适配器的使用效率。
通过这样修改以后,程序的性能会相比之前提高了很多。但是,但是,但是,重要的事情说三遍,我们这样做还是远远不够的。我们仅仅只是把
没有引用的convertView重新利用起来,还是没有达到提高程序运行效率的结果,所以我们对于刚才写的代码还需要改进。所以出现了
ViewHolder。很多人不知道ViewHolder怎么来的,其实是自己定义来的,哈哈。这会你肯定在心里想,我也知道是自己定义的,但是
是用来干嘛的呢? 好吧, 我就献丑给大家说说吧。ViewHolder是自己定义的,你也可以定义成你喜欢的名,ViewHolder是为了让大
家顾名思义。ViewHolder最普遍就是出现在适配器里,为的是当listview滚动的时候快速设置值,而不必每次都重新创建很多对象,
从而来提升程序的性能。这会你懂了吧。所以,我们需要将上面的代码修改成下面这样:
在这段代码中,关键点是要给 convertView设置标签,就是convertView.setTag的方法,因为只有设置了这个方法,原来创建了
的View对象才能进行复用,这样才能提升程序的运行效率。ViewHolder将需要缓存界面数据的view封装好,convertView的setTag
才是将这些缓存起来供下次调用。当然,我们现在设置的布局没有那么复杂,也许你感觉不到他的好处,当你使用完成复杂的界面,需要添
加适配器时,你才会感觉的它的好,我相信你会爱上它的。
可能您发现了,我们在改进这个代码的时候,效率确实是提升了不少,但是出现了一个问题,为了演示,我这点仅仅是用了两个组件,
但是如果我们的条目中如果有三个、四个、五个获取更多的时候呢? 就findViewById就够我们写一段时间了,哪还有心情去写其
他的代码。不过不用担心,当我们在烦恼这个问题的时候,大神们已经为我们想到的问题给出了解决方法。在github上,给我们提供了一个方便的框架
对,就是它,没错,它完美的解决了我们面临的问题。这篇文章中将其使用方法罗列出来,
它的设计思想是使用了 SparseArray来存储view的引用,从而来替代了原本的ViewHolder,不用再声明一大堆View。
使用SparseArray来创建高效ViewHolder,提升程序性能。
第一次写博客,我是一个菜鸟,写博客呢,不是为了说明什么。只是想记录自己从小白一路走过的经历,自己成长的过程,想多年
以后回想起来的时候,感谢现在正在努力的自己。谢谢,不喜勿喷,如果你有更好的想法,我们一起交流,我也想像你一样,成为一个大神~~