listView的原理和优化总结

首先说明一下,该博客只是我自己对平常使用listview的一点理解和总结.

先说说listview的原理,listview的使用最重要的步骤就是:
1.初始化一个listview对象,负责显示数据
2.为listvew创建一个适配器,用来将数据映射到listview上
3.就是要映射的数据,可以是简单的文本,图片,也可以是复杂的布局.

listvew的绘制过程就是ListView在开始绘制的时候,系统首先调用该listview绑定的适配器的getCount()函数,根据他的返回值得到ListView的长度,然后根据这个长度和屏幕能显示的条数调用该listview绑定的适配器的getView()返回的view一行一行的绘制ListView的每一项。如果getCount中的条数很多,在第一次绘制满能显示的条数时,convertview是为null的,当你滑动listview,此时再绘制item时,convertview已经不为null,已经缓存了上一个消失的item的view,如果设置了Tag就可以直接复用converview,通过tag得到该view,这样可以提高效率.

说到listview的使用肯定很简单,重点是对它的优化,如果数据有上万条,不对它优化,效率就会很低,造成卡顿等效果,更严重的直接造成内存泄漏和OOM.所以我在总结了一下优化的几个方案:
1.定义一个static的viewholder和convertview设置Tag来复用viewholder减少对View的创建和findByview()的次数
2. 要设置在不滑动时才加载数据,因为每个item都会加载到listview中,如果连续滑动千万个,即使复用也有可能会造成OOM.最好用分页加载数据(这样就可以不用去设置滑动监听了),这样每次重新请求一次服务器获取到数据更新一次listview,就不会造成oom,最重要的是异步加载数据(图片)时,要等不滑动的时候在去加载,这样就只会加载当前页面几个,防止开过多的线程(一般框架都设置了,所以尽量使用框架来加载图片)
3.如果不是用框架加载图片,只是用Bitmapfactory加载本地图片时,一定要利用Options压缩图片,尽量用软引用来定义Bitmap对象且使用完要调用recyle方法回收.
4.开内部子线程最好也用软引用保存Context引用,如果开启的线程不是很多,可以直接将线程定义为static的

    其实对listvew的优化最主要的就是提高效率防止画面不流畅,其次就是不能造成OOM
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值