您的位置:首页 > 移动开发 > Android开发

Android关于ListView的优化问题

2015-01-01 21:39 351 查看
今天在我哥们的带领下,学习了一些关于ListView的优化方案。现在提出来和大家分享下....

第一点:

在Listview中数据加载时经常用到的ViewHolder,我们需要把它写成静态类static,这样的话数据是共享的在本地缓存中,取出的数据是很快的。

第二点:

如果Listview需要加载图片的话,我们一般是开子线程去加载数据的,然后再主线程中更新。这样的话为了良好的用户体验,我们经常会设置一张默认图片,如果数据还在加载,我们就先显示默认图片,然后在慢慢加载图片。

holder.img.setImageDrawable(defDrawable);
holder.img.setBackgroundResource(R.raw.back);
上面的两种方法都是设置默认图片的,只是效率上有很大的差距。

holder.img.setImageDrawable(defDrawable) 的工作流程是将一张Drawable添加进去,然后有Android绘画机制画出这张图片。要这样做的话,我们需要在listView的适配器的构造方法中先把这张图片获取到。

Resources res = mContext.getResources();
Bitmap bitmap = BitmapFactory.decodeResource(res, R.raw.back);
defDrawable = new BitmapDrawable(res, bitmap);
我们先在raw文件下找到这张图片,把它加载到内存中,然后把它转化为bitmap对象,再将它转化为drawable对象,这样的话Android的原始绘画机制可以很快的画出这张图片。并且我们在加载图片的从头到尾中,只会产生一个对象,不会浪费内存。

holder.img.setBackgroundResource(R.raw.back)的工作流程是先将raw文件夹下的图片加载到内存,然后在转化为bitmap对象,再转为drawable对象,每一张默认图片都会生成一个对象。如果我们有几千甚至几万张图片,这样的可能会内存溢出,程序就会catch掉。





第三点:看见上面的图片了吗?第二张没有加载的。那是我手指正按在Listview上,只有我松开手,它才会加载图片。并且如果我快速的滑动Listview,它只会加载我手指最后离开的那一页的数据信息,前面滑过页面的信息是不会加载的。Android系统自带的源生Listview,如果我们快速滑动的话,每次在翻页的时候,如果你细心的话,会感觉到有卡顿的效果,会很难受的。所以我向大家推荐github上一个大神写的Listview的开源框架FastScrollView,效果很强大的,有需要的朋友可以去试试的。

小技巧:我们可以先预加载一页的图片,以后的先用默认图片代替,这样的效果会很好的...

//先加载第一页图片
if(!TextUtils.isEmpty(item.picUrl)){
if(position<4){
loadIMG(holder.img, item);
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: