Android关于ListView的优化问题

本文分享了ListView的优化方案,包括使用静态ViewHolder、设置默认图片的方法及其效率对比,以及推荐的FastScrollView开源框架,以提高用户体验。

今天在我哥们的带领下,学习了一些关于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);
			}
		}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值