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的优化就先讲到这里,还有什么好的优化方法也恳请各位朋友给我留言,谢谢。

0 0
原创粉丝点击