ListView性能优化
来源:互联网 发布:域名备案注销 编辑:程序博客网 时间:2024/06/14 20:35
问 :List的优化原理是什么,总共有50项,但在屏幕上只看到6项,会创建几项
答: 8个,只会创建比看得见的多2个,性能优化如下;
一、分析问题
造成数据加载时间较长以及占用内存的主要问题是在getView方法中的两项主要操作占用了系统内存。第一,对于列表显示的每一项内容,都需要加载其布局文件(假设布局文件为item.xml)。即View view = Inflater.inflate(R.layout.item1,null);第二,对于每一项中的各种控件都需要进行查找(假设只有TextView控件)。
基于以上两点,如果数据内容较大会占用较大内存,影响数据加载及显示效果。
二、性能优化方案
为了解决以上问题,可以采取以下优化方案。
(一)利用convertView的复用,减少创建view的次数。
在ListView中,并不能显示全部数据,只是按照屏幕可以容纳的最大项目显示列表项,对于每个显示项都需要调用getView()方法。滑动过程中一定是有项进入,有项目退出。退出的项将保存在convertView项,因此新项目可以利用convertView,省略使用inflater方法加载布局文件。每次首先判断convertView是否为空,如果空,我们创建新的convertView;如果不为空,直接利用convertView创建view。不用再次填充布局,能够节省大量内存,效率可以提高200%左右。
(二)创建ViewHolder类,减少findbyId的次数。
加入的每一项,具有相同的控件。每个控件需要在布局文件中找到相应的控件并为其设定内容。为了减少每次加载一些都需要到布局文件中查找每个控件,可以定义一个Viewholder类,为每项创建一个holder对象,将所有控件保持在holder中,并且通过setTag标签进行查找,减少查找控件的次数,效率可以再提高50%。
三、优化代码
1.Public View getView(int position, View convertView, ViewGroup parent) {
2.ViewHolder holder=null;
3.if(convertView==null){ //如果为空,需要填充布局文件
4.convertView=mInflater.inflate(R.layout.item1,null);
5.holder=new ViewHolder();
6.holder.textView=(TextView)convertView.findViewById(R.id.text);
7.convertView.setTag(holder);
8.}else {
9.Holder = (ViewHolder)convertView.getTag();
10.}
11.holder.textView.setText(mData.get(position));
12.return convertView;
13.}
14.}
15.Public class ViewHolder{
16.Public TextView textView;
17.}
四、结论
通过对ListView的优化,可以有效的提高显示效果及加载速度,同时提高用户体验效果。如果进行大量数据加载,可以对较大数据采取分页方式加载,如果对于加载网络资源,可以采取异步方式。
补充说明;
如果我们的Item很多话(比如上万个),都会新建一个View吗?很明显这样内存是接受不了的,Google也不会这么做,Android中有个叫做Recycler的构件,下图是他的工作原理:
很明显,无论数据中是多少个item,在显示上Recycler只存储其中可见的View在内存中。当向下滑动时,顶部不可见Item直接回移动到下方再次填充数据变为新增项。这样就不用每次都新建一个View了。
这个也就是我们在Adapter中常见的getView方法的调用,对应此方法我们就能看出,convertView就是每一Item在Recyler之前的布局视图。
- listview加载性能优化
- listview加载性能优化
- listView性能优化
- android ListView 性能优化
- Android ListView性能优化
- ListView 性能优化
- android listview 性能优化
- Listview性能优化
- Listview性能优化
- ListView性能优化
- ListView的性能优化
- ListView性能优化
- ListView的性能优化
- ListView 性能优化
- Android ListView性能优化
- ListView性能优化
- ListView性能优化
- listView的性能优化
- Contest1376 - "师创杯"烟台大学第二届ACM程序设计精英赛复现Problem C: C-Z型变换
- Windows下编译FFmpeg详解
- 编程珠玑-随机抽样
- 数据库的查询,关于时间的情况
- Repeater中绑定的LinkButton跳转页面及传递参数
- ListView性能优化
- Python之玩转Jython系列(一)
- 静态方法与实例方法共享设计-jquery学习笔记
- 读《程序员编程艺术》之自造Java版本-----插入排序实现最小K问题
- leetcode || 75、Sort Colors
- 看数据结构写代码(37) 图的十字链表的表示与实现
- IOS 多线程原理
- TRANCE宏的利用
- 构建源码树----Linux内核剖析(三)