ListView的优化
来源:互联网 发布:非暴力不合作知乎 编辑:程序博客网 时间:2024/06/07 17:56
首先我们要知道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,而是直接从缓存中取出就行,具体代码贴出来
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的优化就先讲到这里,还有什么好的优化方法也恳请各位朋友给我留言,谢谢。
- ListView的优化
- listView的优化
- ListView的优化
- Listview的优化
- listView的优化
- ListView的优化
- ListView的优化
- listview的优化
- ListView的优化(1)
- ListView的优化(2)
- ListView的优化(3)
- ListView的优化
- listView的优化
- Listview的优化
- 关于listview的优化
- ListView的优化
- ListView的优化
- ListView的优化
- 怎么将jpg转换成pdf文件
- ios socket简单使用
- ios如何添加第三方的字体库
- 用栈实现走迷宫
- 从尾到头打印单链表(C语言)
- ListView的优化
- Intent详解
- 统计利用先序遍历创建的二叉树的深度
- Number
- CentOS6.5系统光纤连接存储的多路径配置及使用方法
- git慢慢整理
- Android 6.0权限机制及开发流程详解
- Android系统架构以及app基础
- Block初探