一、适配器(BaseAdapter)优化
昨天我们一起用ListView实现了一个QQ列表,大家记得我们用的适配器(BaseAdapter)吗?今天我们来讲一下关于适配器的优化。
我觉得让大家印象最深的应该就是 重写他的getVIew方法了吧。没错,在适配器中优化也主要是对他的getView方法进行优化。在上面我们注意到我们每次进入getView的时候,首先都会获取视图(inflate),然后通过findViewById分别找到视图中的每一个控件,然后对他们进行数据操作。
这个逻辑大家应该都已经屡清楚了吧。但是实际上这样做是非常消耗内存的,我们现在只有很少的数据量,如果我们要做的是那种list的item非常多的项目,那么他对内存的消耗是巨大的。你想一下,不管是已经加载过的,还是没有加载过的,都要重新加载他的视图,然后在进行数据操作。
有没有一种方法,可以让我们把已经加载过的视图储存起来,等二次加载时直接调用呢?这就是我们今天要讲的优化方案:
我们首先创建了一歌名为ViewHolder的类,顾名思义,他是一个View的持有者,我们每次加载过的View都可以储存进这个Viewholder里面。
接下来我们在getView中创建一个Viewholder。
下面这段信息量可能有点大,我们慢慢看一下:
首先我们进入getView方法时,先创建了一个局部对象Viewholder的引用;
然后就是判断convertView是不是为空。因为如果是首次加载的item,他的视图,也就是这个convertView是空的,所以在对于首次加载,我们跟优化前没什么两样,只是实例化了holder;然后给holder的四个属性分别赋值。
大家注意一下为什么Viewholder类里面有四个属性,因为我们需要加载的视图中就有四个控件(我这个项目中有4个控件),我们Viewholder的目的就是为了存放已经加载过的数据,所以是四个。
最后我们调用了View的settag方法。把我们holder的值存入了当前这个布局中。
那么else写起来就更简单了,else对应的是如果已经是加载过的布局,那么我们只需要从convertView中找到我们存入的Viewholder,然后在进行数据赋值就好。
这样,我们适配器的优化就完成了。
二、ListView的条目点击事件
我们的ListView中有很多的Item,我们肯定是需要点击的,那么他的点击事件该怎么写呢?
我们切换到我们的Activity界面。
注意了,这里不是setOnCLickListener,而是SetOnItemClickListener。
在onItemClick里面,就是我们点击了条目以后执行的操作了,我们在里面吐司一下。
很简单,不需要我在说什么了吧,我们来看一下效果。
他除了条目点击事件,还有一个条目的长按事件:
我们注意到这个方法是有返回值的,返回的是一个boolean的类型,我来说一下:
当他返回false时,在长按后执行了ItemLongCLick方法之后,还会继续执行ItemClick方法。
当返回true是,在长按后执行了itemLongClick方法之后,不会继续执行itemClick方法。
效果和代码都在上面了,很简单,相信大家都能看懂。
下面我来说一下这两个方法的参数:
parent:这个参数我们用的很少,暂时不谈。
view:这个view就是我们在getView中的convertView,也就是我们获取到的视图。
position和id:这两个参数大多数情况下很像,我们一般只用position。
网友评论