ListView的adapter中getView被多次调用的问题
2012-12-18 10:59
232 查看
在项目中遇到这样一个问题,在每个ListView的item中异步刷新图片时,getView被调用多次,查找资料得到原因是:ListView没有取到实际的高度,无法确定取多少View来填充ListView,也就是运行getView()的具体运行次数。
根据Google的解释,View在Draw的时候分成两个阶段:measure和layout,在measure阶段时主要就是为了计算两个参 数:height和width。而且要注意的是,这是个递归的过程,从顶向下,DecorView开始依次调用自己子元素的measure。计算完成这两 个参数后就开始layout,最后再是draw的调用。
对于ListView,当然每一个Item都会被调用measure方法,而在这个过程中getView和getCount会被调用,而且看用户的需求,可能会有很多次调用。
而为什么会有很多组次调用呢?
问题就在于在layout中的决定ListView或者它的父元素的height和width属性的定义了。fill_parent会好一点,计算 方法会比较简单,只要跟父元素的大小相似就行,但是即使是fill_parent,也不能给View当饭吃,还是要计算出来具体的dip,所以 measure还是会被调用,只是可能比wrap_content的少一点。至于自适应的它会一直考量它的宽和高,根据内容(也就是它的子Item)计算 宽高。可能这个measure过程会反复执行,如果父元素也是wrap_content,这个过程会更加漫长。
所以,解决方法就是尽量避免自适应,除非是万不得已,给ListView设置固定高度。或者填充的效果会比较好一些。
根据Google的解释,View在Draw的时候分成两个阶段:measure和layout,在measure阶段时主要就是为了计算两个参 数:height和width。而且要注意的是,这是个递归的过程,从顶向下,DecorView开始依次调用自己子元素的measure。计算完成这两 个参数后就开始layout,最后再是draw的调用。
对于ListView,当然每一个Item都会被调用measure方法,而在这个过程中getView和getCount会被调用,而且看用户的需求,可能会有很多次调用。
而为什么会有很多组次调用呢?
问题就在于在layout中的决定ListView或者它的父元素的height和width属性的定义了。fill_parent会好一点,计算 方法会比较简单,只要跟父元素的大小相似就行,但是即使是fill_parent,也不能给View当饭吃,还是要计算出来具体的dip,所以 measure还是会被调用,只是可能比wrap_content的少一点。至于自适应的它会一直考量它的宽和高,根据内容(也就是它的子Item)计算 宽高。可能这个measure过程会反复执行,如果父元素也是wrap_content,这个过程会更加漫长。
所以,解决方法就是尽量避免自适应,除非是万不得已,给ListView设置固定高度。或者填充的效果会比较好一些。
相关文章推荐
- 解决ListView,Gallery的Adapter中由于布局问题导致的getView多次调用问题
- 关于重写的listview adapter中,在getView()方法中,打印语句时,相同的position打印了多次,重复调用问题
- Android 解决ListView、GridView在首次显示时adapter可能多次调用getView的问题
- 解决listview,gridview的getview多次调用问题
- 彻底解决listview,gridview的getview多次调用问题
- Android listview&gridview getview 方法多次调用问题解决方法 并附上单页加载实现问卷调查适配器源代码
- Android listview&gridview getview 方法多次调用问题解决方法--->导致gridview错位
- ListView,GridView的getView多次调用问题
- Android ListView 第一次设置Adapter时候getView调用多次
- android listview 连续调用 getview多次问题分析及解决
- Android ListView 第一次设置Adapter时候getView调用多次
- 关于ListView中getView被重复调用多次的问题
- 彻底解决listview,gridview的getview多次调用问题
- Android ListView等getView调用多次问题
- Android listview&gridview getview 方法多次调用问题解决方法
- listview使用Adapter,多次调用getview函数,从而影响性能问题
- ListView和GridView 自定义Adapter的getView()方法调用问题
- 彻底解决listview,gridview的getview多次调用问题
- ListView Adapter里的getView()方法重复调用问题
- 关于ListView的getView方法被多次重复调用的问题