我们每一个Android开发人员对ListView的使用肯定是很熟悉的,然而多少人能真正的懂ListView的缓存机制呢,说白了就是ListView为了提高效率,而内部实现的一种优化,牺牲一点内存。而这种优化就需要复用ItemView(也就是item对应的View).那么下面楼主来对ListView和RecyclerView的item复用问题做一个深入的讲解先来一张大家学习的时候都遇到过的图这里写图片描述看不懂也没啥事,可以接着往下看,先有一个直观的认识首先来解答几个问题为什么会存在Item复用问题答:ListView内部为了优化而建立的复用机制,在下面方法中第二个参数就是ListView传递给你,让你进行复用的View.如果你不想复用listview传递给你的View,那你每次都需要创建一个新的View进行返回,这样子是肯定不会出现复用问题的,但是性能却是很消耗的。
{}123412342.为什么上述的getView方法中第二个参数有时候为null呢因为ListView默认缓存一页的View,什么叫一页,也就是你当前listview界面上有几个Item可以显示,listview就缓存几个.
当现实第一页的时候,由于没有一个Item被创建,所以第一页的Item的getView方法中的第二个参数都是为null的假如listview只能最多显示8条记录,则第一页显示的时候listview内部缓存了这8个itemView.当第九条记录出现在视野中的时候,listview就会在调用getView方法的时候在第二个参数处传入之前用过的itemView。
3.为什么需要ViewHolder呢?这个又是干嘛的为什么需要 上述我们谈到itemView的复用是为了性能,那么ViewHolder同样也是为了提高性能.我们都知道我们要显示列表数据.就要在getView方法中拿到对应下标的数据然后对itemView中的控件进行设值,所以我们需要用到findViewById(int id)方法来找到控件,并且强转成我们想要的类型之后,然后设置数据,而findViewById(int www.huafanyun.cn id)方法在列表滚动的时候频繁调用getView方法的时候也是一个比较消耗性能的操作.所以ViewHolder来了是干嘛的 为了在列表滚动的时候,频繁调用getView方法的时候尽量提高性能.我们可以使用一个普通类,这个类通常就起名字为了,当创建itemView的时候,我们也把里面要用到的控件也找到,然后放在类中,然后再通过itemView.setTag(Object ob)方法实现一个itemView和一个进行绑定.
经过上述的操作,如果在getView方法中传入了复用的itemView,那么我们可以毫不客气地从里面拿出这个itemView对应的ViewHolder,从而避免了去调用多个findViewById(int id)去找到控件并设值.因为之前你把找到的控件都放在了ViewHolder中扩展 如果你的itemView中只有一个控件需要显示,那么ViewHolder就不需要了,你可以直接把这个控件和itemView进行关联,也就是你需要深刻理解ViewHolder的作用,它是为了把你找到的多个控件和itemView关联。所以当你只有一个控件的时候,这个ViewHolder就不需要啦方法直接把这个控件设置上去就可以啦,复用的时候直接拿出来那么主要的问题解答完了,总得写点代码来让大家更深刻的体会一下.
博主几乎会重现我们开发中的常见问题,来对应的讲解方法在什么时候调用回答:在每一个item从不可见变为可见的时候动手实践实现一个简单的列表,使用ListView控件,并且Item中有复选框的xml文件1234567891011121312345678910111213就是一个列表控件的Item的xml1234567891011121314151617181920123456789101112131415161www.feilafan.cn7181920的适配器}}}}}}1www.yunfanfei.cn2345678910111213141516171819202122232425262728293031323334351234567891011121314151617181920212223242526272829303132333435这代码非常简单,不再啰嗦代码}}}12345678910111213141516171819202122232425261234567891011121314151617181920212223242526代码贴完了,都是非常的简单,先看下运行效果这里写图片描述这里很需要你们关注的是我们的适配器中的getView中的代码}12341234我们上面说过了方法中第二个参数是ListView会传的itemView,提高效率用的,而这里博主先不用,每次调用getView都会创建一个新的View然后返回实现一个小目标,嗯:奇数的Item中的复选框要被选中那么很容易,只需要这样子//找到文本框//设置文本内容//找到复选框如果是奇数}}12345678910111213141516171234567891011121314151617代码也很简单,就是找到了创建的布局item中的文本控件和复选框,然后设置相应的内容看效果这里写图片描述我们可以看到,功能实现了,而且没有出现任何问题,比如常见的复用问题,嗯喂喂喂,我们没复用回传的View,哪里来的复用问题啊,哈哈哈,所以我们的列表是肯定没有任何问题的,因为根本没有复用,性能是最差的一种写法实现一个小目标,复用Item,嗯}//找到文本框//设置文本内容//找到复选框如果是奇数}}1234567891011121314151617181www.yunfeizao.cn 920212223241234567891011121www.feiyunfan.cn31415161718192021222324这段代码改动的地方就是方法最开始,判断了一下回传给我的view是不是为null,为null的情况博文最开始已经讲过了如果为null就创建一个新的,如果不是就直接赋值给item,达到条目的复用!
那我们看看效果呗!
这里写图片描述请大声的告诉我,发生了什么?复用问题没错,复用问题出现了,博主给大家重现了错误那么这里是怎么引起的呢?
只有知道其中的原理,你解决问题才能快准狠!
首先我先帮大家统计一下创建Item的次数这里写图片描述可以看到,我用一个变量记录创建的次数,我重新运行这里写图片描述从App运行到滑动来滑动去,我们可以看见,最开始创建了16次,然后随着滑动多来了一次,你可以使用截图定格一下动图,你会发现这个列表最多显示17条记录(当然了你的界面是多少个和我这个界面是不同的,反正就是界面能显示的Item最多个数),所以证明了上面的一个观点,ListView默认缓存一个界面的Item个数原理所以当我们复用ListView回传的View的时候,这个View是被之前使用过的,也就是说给你的这个View保存了之前用过的状态这里的情况就是给你的view刚好是之前复选框被选中的那个View,所以就造成复用啦解决方法对产生问题的控件进行初始化,初始化时什么意思呢?
意思就是说,把出问题的控件,状态还原一下看代码!
这里写图片描述别看了,就是框框里面的一句话,是不是感觉很简单呀,如果你知晓原理,为什么这样子就没有了复用的问题呢?
因为如果给你的View里面的复选框是被选中的,这里你对他还原了呀,所以就ok啦使用上面我们也说了ViewHolder的作用和使用的必要性,那么博主直接来用一下吧由于getView内部稍微改动有点大,我贴上Adapter中的代码}}}}对应的试图//找到文本框//找到复选框//让item和ViewHolder绑定在一起//复用ListView给的View//拿出}//设置文本内容//还原状态如果是奇数}}/*** 用于存放一个ItemView中的控件,由于这里只有两个控件,那么声明两个控件即可*/}}1234567891011121314151617181920212223242526272829303132333435www.feiyunyl.cn3637383940414243444546474849505152535455565758596061626www.feihuayl.cn 36465666768697071721234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666www.fsmaxbuy.com/768697071721.如果复用的View为null,我们需要创建一个新的item,同时也创建了一个ViewHolder,然后把条目视图中的控件通过findViewById方法寻找到中,然后我们说了需要和条目视图进行绑定,所以调用了setTag方法2.而另一边,如果复用的View不是为null,那么直接拿过来用,并且从里面拿出ViewHolder,因为每一个复用的ViewHolder肯定是经过1处创建并且返回的到这里为止,一个完成的列表的展示和优化已经完成啦,并且中间讲述了复用问题是如何产生的,如何解决!
ListView复用和优化详解
时间: 2024-11-03 03:26:00
ListView复用和优化详解的相关文章
lucene、lucene.NET详细使用与优化详解
lucene.lucene.NET详细使用与优化详解 2010-02-01 13:51:11 分类: Linux 1 lucene简介1.1 什么是luceneLucene是一个全文搜索框架,而不是应用产品.因此它并不像www.baidu.com 或者google Desktop那么拿来就能用,它只是提供了一种工具让你能实现这些产品. 1.2 lucene能做什么要 回答这个问题,先要了解lucene的本质.实际上lucene的功能很单一,说到底,就是你给它若干个字符串,然后它为你提供一个全文搜
MySQL数据库优化详解(收藏)
MySQL数据库优化详解 mysql表复制 复制表结构+复制表数据mysql> create table t3 like t1;mysql> insert into t3 select * from t1;mysql索引 ALTER TABLE用来创建普通索引.UNIQUE索引或PRIMARY KEY索引ALTER TABLE table_name ADD INDEX index_name (column_list)ALTER TABLE table_name ADD UNIQUE (colu
Nginx配置文件优化详解
Nginx配置文件优化详解 对nginx进行优化是重点也是难点,这里给出一些常用的优化措施,以及相关参数的所代表的意思.有些参数需要结合公司服务器进行设置. 全局变量的优化: #定义Nginx运行的用户和用户组user www www: #启动进程,通常设置成和cpu的数量相等 worker_processes 8: #为每个进程分配cpu. worker_cpu_affinity 00000001 00000010 00000100 00001000 00010000 00100000
lucene、lucene.NET详细使用与优化详解[转]
1 lucene简介1.1 什么是luceneLucene是一个全文搜索框架,而不是应用产品.因此它并不像www.baidu.com 或者google Desktop那么拿来就能用,它只是提供了一种工具让你能实现这些产品. 1.2 lucene能做什么要 回答这个问题,先要了解lucene的本质.实际上lucene的功能很单一,说到底,就是你给它若干个字符串,然后它为你提供一个全文搜索服务,告诉你 你要搜索的关键词出现在哪里.知道了这个本质,你就可以发挥想象做任何符合这个条件的事情了.你可以把站
ListView 和 GridView应用详解-----本文转自博客园
1. 选择 ListView 或 GridView ListView 和 GridView 控件均用于显示应用中数据的集合.它们的功能十分相似,但是显示数据的方式不同.它们都派生自 ItemsControl 类. ListView 采用垂直堆叠的方式显示数据.该控件常用于显示按顺序排列的项目列表,如电子邮件列表或搜索结果列表.它在主从式列表情况下也很有用,其中的列表项仅包含少量信息,并且选定项目的详细信息会单独显示. GridView 采用水平堆叠的方式显示数据.对于占驻较多控件的每个项目(如照
Linux下的I/O复用与epoll详解
前言 I/O多路复用有很多种实现.在linux上,2.4内核前主要是select和poll,自Linux 2.6内核正式引入epoll以来,epoll已经成为了目前实现高性能网络服务器的必备技术.尽管他们的使用方法不尽相同,但是本质上却没有什么区别.本文将重点探讨将放在EPOLL的实现与使用详解. 为什么会是EPOLL select的缺陷 高并发的核心解决方案是1个线程处理所有连接的“等待消息准备好”,这一点上epoll和select是无争议的.但select预估错误了一件事,当数十万并发连接存
(转)SqlServer索引及优化详解(1)
(一)深入浅出理解索引结构 ??????? 实际上,您可以把索引理解为一种特殊的目录.微软的SQL SERVER提供了两种索引:聚集索引(clustered index,也称聚类索引.簇集索引)和非聚集索引(nonclustered index,也称非聚类索引.非簇集索引).下面,我们举例来说明一下聚集索引和非聚集索引的区别: ??????? 其实,我们的汉语字典的正文本身就是一个聚集索引.比如,我们要查"安"字,就会很自然地翻开字典的前几页,因为"安"的拼音是&q
MySQL-5.5.32 配置文件优化详解
MySQL-5.5.32 配置文件优化详解============================== [TOC] # 一.配置文件说明 > MySQL-5.5.32是Mysql5.5系列中最后一个版本,也是最后一个有配置文件的版本,为什么这么说呢,用过5.6的博友都知道,在mysql5.6中已经不提供配置文件选择,只有一个默认的配置文件,好了,我们今天说的是5.5.32这个版,就不和大家说5.6了,下面我们来具体说一下,mysql5.5.32中,提供可选的几个配置文件, * my-small.
MySQL之SQL优化详解(二)
目录 MySQL之SQL优化详解(二) 1. SQL的执行顺序 1.1 手写顺序 1.2 机读顺序 2. 七种join 3. 索引 3.1 索引初探 3.2 索引分类 3.3 建与不建 4. 性能分析Explain MySQL之SQL优化详解(二) 1. SQL的执行顺序 1.1 手写顺序 1.2 机读顺序 2. 七种join 3. 索引 3.1 索引初探 是什么: 排好序的快速查找数据结构 两个主要的索引结构: B+tree 索引和哈希索引. 如何建: 1. ALTER TABLE table