ListView的优化
2016-04-14 15:20
183 查看
首先我们要知道listview的原理,它的每个item显示的时候都会调用adapter中的getview的方法,并且,在getview中寻找view的控件的时候,是每个控件都会去findViewById寻找一遍的,基于此,以及查询资料,小白弄清楚了这两个问题的优化方法。
1.我们需要重写baseadapter的getview方法,然后复用convertView。
2.把控件对象设置到viewholder对象中。
下面讲一下这两个方法的具体应用。
1.当listview显示大量item的时候,每次加载都会重新创建一个view对象,这样必将占用很多内存空间,从xml生成view,这个是一个IO操作,很耗时,android提供了一个Recycler(反复循环器),当item滑动的时候滚出了我们的视野,相应的view就会缓存到Recycler中,这样我们不必每次去滑动的时候去新创建一个Item,而是直接从缓存中取出就行,具体代码贴出来
2.我们知道,view的控件对象每次初始化的时候都会去findViewById, findViewById是一个树查找过程,也是一个耗时的操作,当我们每次初始化一个item的时候,都需要为他的控件去findViewById,这样下来,就会对性能造成很严重的影响,这也是我们不愿意看到的,所以,我们在第一次创建convertView对象的时候,就把item中的控件实例化出来放到ViewHolder对象中,然后用convertView的setTag将对象设置到Tag中,这样,当listview加载item的时候直接Tag中取出ViewHolder对象就好了,而不用每次都去findViewByIdle。
贴出代码
还有一个就是图片加载的小bug,写过listview的朋友会知道,listview的图片加载会重复加载,第一个item会和我们下面看不到的item的第一个会发生图片重复加载,就是当我们滑到下面的时候,刚刚看不到的第一个item会先加载第一个item的图片,然后再加载正确的我们所谓的刚刚看不到的第一个item。解决方法我暂时还不会,还请懂得人私聊我,在下将感激不尽。
最后在说一个通过Lrucache来降低用户访问时候的流量使用。就是用内存换性能。可以将从网络下载下来的图片放入缓存中,当我们再次滑动的时候,就不用去网络上下载,而是直接从内存中取出来,这样就可以节约用户的流量,具体的代码我不在这里贴出来,有需要的可以私聊我。今天的ListView的优化就先讲到这里,还有什么好的优化方法也恳请各位朋友给我留言,谢谢。
1.我们需要重写baseadapter的getview方法,然后复用convertView。
2.把控件对象设置到viewholder对象中。
下面讲一下这两个方法的具体应用。
1.当listview显示大量item的时候,每次加载都会重新创建一个view对象,这样必将占用很多内存空间,从xml生成view,这个是一个IO操作,很耗时,android提供了一个Recycler(反复循环器),当item滑动的时候滚出了我们的视野,相应的view就会缓存到Recycler中,这样我们不必每次去滑动的时候去新创建一个Item,而是直接从缓存中取出就行,具体代码贴出来
if (convertView == null) { viewHolder = new ViewHolder();//为空就创建一个viewholder对象。 convertView = mInflater.inflate(R.layout.listview_item, null); viewHolder.tlTextView = (TextView) convertView .findViewById(R.id.tv_course_title); viewHolder.ctTextView = (TextView) convertView .findViewById(R.id.tv_course_detail); viewHolder.picImageView = (ImageView) convertView .findViewById(R.id.iv_course_picture); convertView.setTag(viewHolder);//将viewholder对象放入Tag中 } else { viewHolder = (ViewHolder) convertView.getTag();// 不为空就convertView 复用 }
2.我们知道,view的控件对象每次初始化的时候都会去findViewById, findViewById是一个树查找过程,也是一个耗时的操作,当我们每次初始化一个item的时候,都需要为他的控件去findViewById,这样下来,就会对性能造成很严重的影响,这也是我们不愿意看到的,所以,我们在第一次创建convertView对象的时候,就把item中的控件实例化出来放到ViewHolder对象中,然后用convertView的setTag将对象设置到Tag中,这样,当listview加载item的时候直接Tag中取出ViewHolder对象就好了,而不用每次都去findViewByIdle。
贴出代码
viewHolder.tlTextView = (TextView) convertView .findViewById(R.id.tv_course_title); viewHolder.ctTextView = (TextView) convertView .findViewById(R.id.tv_course_detail); viewHolder.picImageView = (ImageView) convertView .findViewById(R.id.iv_course_picture); convertView.setTag(viewHolder);//将viewholder对象放入Tag中
还有一个就是图片加载的小bug,写过listview的朋友会知道,listview的图片加载会重复加载,第一个item会和我们下面看不到的item的第一个会发生图片重复加载,就是当我们滑到下面的时候,刚刚看不到的第一个item会先加载第一个item的图片,然后再加载正确的我们所谓的刚刚看不到的第一个item。解决方法我暂时还不会,还请懂得人私聊我,在下将感激不尽。
最后在说一个通过Lrucache来降低用户访问时候的流量使用。就是用内存换性能。可以将从网络下载下来的图片放入缓存中,当我们再次滑动的时候,就不用去网络上下载,而是直接从内存中取出来,这样就可以节约用户的流量,具体的代码我不在这里贴出来,有需要的可以私聊我。今天的ListView的优化就先讲到这里,还有什么好的优化方法也恳请各位朋友给我留言,谢谢。
相关文章推荐
- Lucene实战构建索引
- TDD
- begin
- MySQL的Explain命令
- 柔性数组
- java中String+String与StringBuilder的append()方法的效率问题
- 怎么将jpg转换成pdf文件
- 数字转换成字符串,int 转换成const char*
- 优先级队列与堆排序
- 236. Lowest Common Ancestor of a Binary Tree
- Android studio 2.0--android增量更新的那些事
- ios socket简单使用
- ios如何添加第三方的字体库
- MassTransit 学习记录(三) 广播 & 负载
- 设计模式——适配器模式
- android------关于query的模糊查询的用法
- 关于进程页表内核部分和内核主页表的关系(Linux 2.6.11)
- 已有打开的与此 Command 相关联的 DataReader,必须首先将它关闭
- 汇总--如何计算Gradle脚本中每个task的执行时间
- jFinal开发规范