Android性能优化之Listview(ViewHolder重用机制)
来源:互联网 发布:质量问题淘宝怎么陪 编辑:程序博客网 时间:2024/06/06 00:20
好久没发博客了,因为发博客太耗时间了,而且参考的比较多,也不想一直带着转载两个字。都一直放在笔记里。不过只能自己看不能和大家分享了,看到这篇文章令我恍然大悟,很有帮助,所以还是决定写下来。
相信大家在很多时候都会用到ListView这个控件,因为确实是用的很多很多,但是有木有遇到过当数据很多很多的时候,往下滑ListView时有时候会卡顿,这就需要我们来优化它了。
ListView优化主要有下面几个方面:
1、convertView重用
2、ViewHolder的子View复用
3、缓存数据复用
一、convertView重用
首先讲下ListView的原理:ListView中的每一个Item显示都需要Adapter调用一次getView()的方法,这个方法会传入一个convertView的参数,这个方法返回的View就是这个Item显示的View。如果当Item的数量足够大,再为每一个Item都创建一个View对象,必将占用很多内存空间,即创建View对象(mInflater.inflate(R.layout.lv_item, null);从xml中生成View,这是属于IO操作)是耗时操作,所以必将影响性能。Android提供了一个叫做Recycler(反复循环)的构件,就是当ListView的Item从滚出屏幕视角之外,对应Item的View会被缓存到Recycler中,相应的会从生成一个Item,而此时调用的getView中的convertView参数就是滚出屏幕的缓存Item的View,所以说如果能重用这个convertView,就会大大改善性能。
那么,我们怎么重用它呢?贴代码:
如图,当这个convertView不存在时,即第一次使用它,我们就创建一个item布局的View对象并赋给convertView,以后使用convertView时,只需从convertView中getTag取出来就可以,不需要再次创建item的布局对象了,这样便提高了性能。
二、使用ViewHolder重用
我们都知道在getView()方法中的操作是这样的:先从xml中创建view对象(inflate操作,我们采用了重用convertView方法优化),然后在这个view去findViewById,找到每一个item的子View的控件对象,如:ImageView、TextView等。这里的findViewById操作是一个树查找过程,也是一个耗时的操作,所以这里也需要优化,就是使用ViewHolder,把每一个item的子View控件对象都放在Holder中,当第一次创建convertView对象时,便把这些item的子View控件对象findViewById实例化出来并保存到ViewHolder对象中。然后用convertView的setTag将viewHolder对象设置到Tag中, 当以后加载ListView的item时便可以直接从Tag中取出复用ViewHolder对象中的,不需要再findViewById找item的子控件对象了。这样便大大提高了性能。
贴个完整的代码:
- Android性能优化之Listview(ViewHolder重用机制)
- Android性能优化之Listview(ViewHolder重用机制)
- Android性能优化之Listview(ViewHolder重用机制)
- Android性能优化之Listview(ViewHolder重用机制)
- Android:ListView 使用 viewholder 性能优化(Listview工作原理)
- Android学习之 listview加载性能优化ViewHolder
- 【Android 基础】listview加载性能优化之ViewHolder大法
- ListView性能优化之convertView和ViewHolder
- Android ListView的性能优化(ViewHolder和HashMap)
- listview加载性能优化ViewHolder (转)
- Android性能优化之ListView缓存机制
- Android性能优化之ListView缓存机制
- android ListView的优化之 static ViewHolder
- ListView优化之ViewHolder
- Android - ViewHolder优化ListView
- Android ViewHolder 优化 ListView
- ViewHolder重用机制 RecyclerView+CardView 优化
- listview加载性能优化ViewHolder
- Cobertura 统计多模块maven项目测试覆盖率
- MySQL的安装
- [CF730J]Bottles
- Unique Binary Search Trees
- 探究数据结构之链表Java代码实现(二)
- Android性能优化之Listview(ViewHolder重用机制)
- adb不是内部或外部命令,也不是可运行的程序
- H5在微信公众号的下拉刷新实现
- solaris 5.10 rac 11.2.0.4 安装
- 卡尔曼滤波器算法浅析及matlab实战
- spring-boot初尝试
- 正则表达式的简单使用
- code
- [CF721C]Journey