美文网首页
2018-03-24—ListView优化以及相关点击事件

2018-03-24—ListView优化以及相关点击事件

作者: 季白zy | 来源:发表于2018-03-24 11:33 被阅读0次

    一、适配器(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。

    相关文章

      网友评论

          本文标题:2018-03-24—ListView优化以及相关点击事件

          本文链接:https://www.haomeiwen.com/subject/ghkqcftx.html