您的位置:首页 > 其它

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,而是直接从缓存中取出就行,具体代码贴出来

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的优化就先讲到这里,还有什么好的优化方法也恳请各位朋友给我留言,谢谢。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: