ListView优化

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。以及做好图片缓存。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值