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

listView的原理和优化总结

2015-11-13 16:41 246 查看
首先说明一下,该博客只是我自己对平常使用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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  listview 优化 android