ListView的优化主要有
一、复用convertView,减少findViewById的次数
1、优化:复用convertView
Android系统本身为我们考虑了ListView的优化问题,在复写的Adapter的类中,比较重要的两个方法是getCount()和getView()。界面上有多少个条显示,就会调用多少次的getView()方法;因此如果在每次调用的时候,如果不进行优化,每次都会使用View.inflate(….)的方法,都要将xml文件解析,并显示到界面上,这是非常消耗资源的:因为有新的内容产生就会有旧的内容销毁,所以,可以复用旧的内容。
优化:
在getView()方法中,系统就为我们提供了一个复用view的历史缓存对象convertView,当显示第一屏的时候,每一个item都会新创建一个view对象,这些view都是可以被复用的;如果每次显示一个view都要创建一个,是非常耗费内存的;所以为了节约内存,可以在convertView不为null的时候,对其进行复用,也就是直接对其添加相关数据即可。
2、优化:缓存item条目的引用——ViewHolder
findViewById()这个方法是比较耗性能的操作,简单的说ViewHolder的作用就是将已经通过findViewById()的方法找到的view对象存起来,以减少findViewById()的调用次数。
①定义存储控件引用的类ViewHolder
这里的ViewHolder类需要不需要定义成static,根据实际情况而定,如果item不是很多的话,可以使用,这样在初始化的时候,只加载一次,可以稍微得到一些优化。
不过,如果item过多的话,建议不要使用。因为static是Java中的一个关键字,当用它来修饰成员变量时,那么该变量就属于该类,而不是该类的实例。所以用static修饰的变量,它的生命周期是很长的,如果用它来引用一些资源耗费过多的实例(比如Context的情况最多),这时就要尽量避免使用了。
class ViewHolder{
//定义item中相应的控件
}
②创建自定义的类:ViewHolder holder = null;
③将子view添加到holder中:
在创建新的listView的时候,创建新的ViewHolder,把所有孩子全部找到,并把孩子的引用给存起来。
通过view.setTag(holder)将引用设置到view中。
通过holder,将孩子view设置到此holder中,从而减少以后查询的次数。
④在复用listView中的条目的时候,通过view.getTag(),将view对象转化为holder,即转化成相应的引用,方便在下次使用的时候存入集合。
通过view.getTag(holder)获取引用(需要强转)
-------------------------------------------------------------------------------------------------------------------------------------------------
以上是对于adapter中getView()方法中的一些优化。
二、ListView数据的分页加载
如果ListView需要显示10万条数据,应该怎样显示?
解决办法:
优化查询的数据:先获取几条数据显示到界面上。
进行分页处理---优化了内存空间不至于OOM。
现在分页加载的第三方控件已经很成熟了。
设置ListView的滚动监听器:setOnScrollListener(new OnScrollListener{….})
在滚动状态发生改变的方法中,有三种状态:
手指按下移动的状态: SCROLL_STATE_TOUCH_SCROLL: // 触摸滑动
惯性滚动(滑动(flgin)状态): SCROLL_STATE_FLING: // 滑动
静止状态: SCROLL_STATE_IDLE: // 静止
根据以上三种状态来决定数据加载的时机。
加载图片是避免oom。以及做好图片缓存。