Android ListView适配器中的getView()被复用详解

原创 2015年07月10日 11:23:16

关于ListViewgetView被重复调用的问题

在这之前,申明下,这篇属于总结一些网上的内容加自己实践证明。


ListView显示数据时,自定义了一个适配器(extends BaseAdapter,然后重写了getView方法,现在出现一个问题,就是这个getView()方法:

 

被重复调用了;

比如我的_data中有两条数据,但是getView()方法 却被执行了四次甚至更多,请问这是神马情况?

这是什么样的情况,看了网上的资料以后我知道原来没有设置器listview 的布局方式不是fill-parent,而是wrap-content,会计算父控件的高度所以造成了一种反复调用情况,从而次数不确定。

更深层次的解释为:

ViewDraw的时候分成两个阶段:measurelayout,在measure阶段时主要就是为了计算两个参数:heightwidth。而且要注意的是,这是个递归的过程,从顶向下,DecorView开始依次调用自己子元素的measure。计算完成这两个参数后就开始layout,最后再是draw的调用。

对于ListView,当然每一个Item都会被调用measure方法,而在这个过程中getViewgetCount会被调用,而且看用户的需求,可能会有很多次调用。

而为什么会有很多组次调用呢?

问题就在于在layout中的决定ListView或者它的父元素的heightwidth属性的定义了。fill_parent会好一点,计算方法会比较简单,只要跟父元素的大小相似就行,但是即使是fill_parent,也不能给View当饭吃,还是要计算出来具体的dip,所以measure还是会被调用,只是可能比wrap_content的少一点。至于自适应的它会一直考量它的宽和高,根据内容(也就是它的子Item)计算宽高。可能这个measure过程会反复执行,如果父元素也是wrap_content,这个过程会更加漫长。

所以,解决方法就是尽量避免自适应,除非是万不得已,固定大小或者填充的效果会比较好一些。

具体例子详介:

 

1、xml布局没有写成固定高度/fill_cntent/match_parent时;



执行结果:


不难看出,getView()一共执行了4轮,已经复用多轮;


2、写成固定高度/fill_cntent/match_parent时:



执行结果:

 

现在,getView()只执行了1轮;也是我们需要的结果;


以上对比就可以看出我们需要怎么去处理;

如果复用多次,在 适配器显示图片 或 点击事件 的时候,可能会导致position错乱,从而刷新显示的时候:(不对应)错位现象!

 

另外一个带提到的,也是listView这类带缓存控件显示的优点:

如果数据很多条(list.size()),超出屏幕很多(具体是多少没细究);listView的只会先执行一部分的getView()方法(应该就屏幕内的数据数次)而不会上来就执行list.size()全部数据的总次数;当你下滑时,getView()方法才会继续执行一部分......(其实就是listView缓存机制)哈哈....结合这个例子去看这个缓存机制,效果会好很多哦!

 

无奈的补充下,listView被嵌套的时候,如上:父listView追寻上述方法;子listView不管怎么设置,还是会复用多次....我也测试了好久没找到好方法(问大神,度娘什么的),如果有大神知道,可以分享下...

 

 

版权声明:本文为博主原创文章,未经博主允许不得转载。

浅析android适配器adapter中的那些坑

做项目中遇到的,折磨了我将近两天,今天把经验分享出来,让大家以后少走点弯路,好了,简单来说一下什么是android的适配器,如何定义,如何增加适配器的重用性,如何去降低程序的耦合性 适配器顾名思义是...

Android AdapterView View的复用机制 分析

对于ListView、GridView相信大家都不陌生,重写个BaseView,实现对于的几个方法,然后就完成了我们的界面展示,并且在大部分情况下,我们加载特别多的Item也不会发生OOM,大家也都明...

50个Android开发技巧(24 处理ListView数据为空的情况)

在移动平台上为用户展示数据的一个常用方法是将数据填充进一个List内,而此时需要注意的一点就是:           如何处理需要填充的数据为空的情况?           ListView及其他...

Android-BaseAdapter中重写getview的心得以及发现convertView回收的机制

http://blog.csdn.net/pkxiuluo01/article/details/7380974 以前一直在用BaseAdapter,对于其中的getview方法的重写一直不太...

Android项目:模仿ConvertView原理(ListView的getView方法)对View对象进行回收和复用

在项目优化过程中,通过MAT监控发现存在一处内存泄露,反复进入某个页面,内存占用越来越大。后分析找到了泄露原因,原来是在自定义列表中,将行布局的layout文件inflate成view对象的时候,每加...

Android中适配器getView()原理和ListView加载多个Item.

工作原理: ListView 针对List中每个item,要求 adapter “给我一个视图” (getView)。一个新的视图被返回并显示      如果我们有上亿个项目要显示怎么办?为每个项目...

ListView适配器BaseAdapter之getView的原理--convertView源码分析Android5.1

ListView.setAdapter后, List中每个item,要求 adapter 调用返回一个View 。如果我们有成千上万的item要显示怎么办?为每个item创建一个新视图是不可取的!实际...

Android listview&gridview getview 方法多次调用问题解决方法 并附上单页加载实现问卷调查适配器源代码

一 、 关于listview 的问题     (1)情况一:      今天在改毕设代码的时候,突然发现一个奇怪的现象,就是在在定义的listview中有一个imageview和一个textvie...

关于ListView的适配器中的getView方法调用多少次的现象探究,很诡异的!!!!

场景:ListView中有4个Item,那么,我问,第一次显示ListView时,getVie方法调用多少次?第二次显示ListVie时,又调用多少次? 有的人说不就4次吗,有的人说这个我不知道,有...
  • liuxiIT
  • liuxiIT
  • 2012年08月16日 14:22
  • 3875

android listview getview多调用俩周期

  • 2016年01月22日 10:53
  • 1.56MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Android ListView适配器中的getView()被复用详解
举报原因:
原因补充:

(最多只允许输入30个字)