解决ListView的getview调用次数多于子view个数的问题

摘要:
我们知道listview的getview调用的数量与其子视图的数量有关。执行次数取决于屏幕上可以显示的条目数。例如,如果您有100行,但一个屏幕上只能显示5行,则系统将在启动程序时调用getView方法五次。虽然在下拉时会重复调用getview,但第一次加载getview时,getview调用的次数是手机一个屏幕上可以显示的项目数。

我们知道listview的getview调用次数是和他的子view个数相关的,执行次数取决于你屏幕上能显示几个条目,比如你有100行 ,但是你一屏只能显示5行,那么启动程序的时候 系统调用5次getView方法。虽然当你下拉的时候会不断的调用getview,但是首次加载的时候getview调用次数是你手机一屏能显示的item个数。比如我这里有一个listview,测试的手机能一次显示7个item(如图),那么正常情况下首次加载的时候log应该是这样的:

解决ListView的getview调用次数多于子view个数的问题第1张09-19 10:01:50.533: I/jianghejie(22297): getview-postion=0
09-19 10:01:50.540: I/jianghejie(22297): getview-postion=1
09-19 10:01:50.595: I/jianghejie(22297): getview-postion=2
09-19 10:01:50.603: I/jianghejie(22297): getview-postion=3
09-19 10:01:50.619: I/jianghejie(22297): getview-postion=4
09-19 10:01:50.626: I/jianghejie(22297): getview-postion=5
09-19 10:01:50.642: I/jianghejie(22297): getview-postion=6

但是实际情况却不是这样,而是重复了数次,很明显这是异常现象,log如下:

09-19 10:21:35.251: I/jianghejie(23718): getview-postion=0
09-19 10:21:35.259: I/jianghejie(23718): getview-postion=1
09-19 10:21:35.259: I/jianghejie(23718): getview-postion=2
09-19 10:21:35.267: I/jianghejie(23718): getview-postion=3
09-19 10:21:35.275: I/jianghejie(23718): getview-postion=4
09-19 10:21:35.275: I/jianghejie(23718): getview-postion=5
09-19 10:21:35.283: I/jianghejie(23718): getview-postion=6
09-19 10:21:35.290: I/jianghejie(23718): getview-postion=0
09-19 10:21:35.290: I/jianghejie(23718): getview-postion=1
09-19 10:21:35.298: I/jianghejie(23718): getview-postion=2
09-19 10:21:35.298: I/jianghejie(23718): getview-postion=3
09-19 10:21:35.306: I/jianghejie(23718): getview-postion=4
09-19 10:21:35.314: I/jianghejie(23718): getview-postion=5
09-19 10:21:35.314: I/jianghejie(23718): getview-postion=6
09-19 10:21:35.431: I/jianghejie(23718): getview-postion=0
09-19 10:21:35.478: I/jianghejie(23718): getview-postion=1
09-19 10:21:35.486: I/jianghejie(23718): getview-postion=2
09-19 10:21:35.494: I/jianghejie(23718): getview-postion=3
09-19 10:21:35.494: I/jianghejie(23718): getview-postion=4
09-19 10:21:35.501: I/jianghejie(23718): getview-postion=5
09-19 10:21:35.509: I/jianghejie(23718): getview-postion=6
09-19 10:21:35.556: I/jianghejie(23718): getview-postion=0
09-19 10:21:35.564: I/jianghejie(23718): getview-postion=1
09-19 10:21:35.564: I/jianghejie(23718): getview-postion=2
09-19 10:21:35.572: I/jianghejie(23718): getview-postion=3
09-19 10:21:35.572: I/jianghejie(23718): getview-postion=4
09-19 10:21:35.580: I/jianghejie(23718): getview-postion=5
09-19 10:21:35.580: I/jianghejie(23718): getview-postion=6
09-19 10:21:35.587: I/jianghejie(23718): getview-postion=0
09-19 10:21:35.595: I/jianghejie(23718): getview-postion=1
09-19 10:21:35.603: I/jianghejie(23718): getview-postion=2
09-19 10:21:35.611: I/jianghejie(23718): getview-postion=3
09-19 10:21:35.619: I/jianghejie(23718): getview-postion=4
09-19 10:21:35.626: I/jianghejie(23718): getview-postion=5
09-19 10:21:35.634: I/jianghejie(23718): getview-postion=6
09-19 10:21:35.665: I/jianghejie(23718): getview-postion=0
09-19 10:21:35.673: I/jianghejie(23718): getview-postion=1
09-19 10:21:35.673: I/jianghejie(23718): getview-postion=2
09-19 10:21:35.681: I/jianghejie(23718): getview-postion=3
09-19 10:21:35.681: I/jianghejie(23718): getview-postion=4
09-19 10:21:35.681: I/jianghejie(23718): getview-postion=5
09-19 10:21:35.689: I/jianghejie(23718): getview-postion=6
09-19 10:21:35.689: I/jianghejie(23718): getview-postion=0
09-19 10:21:35.697: I/jianghejie(23718): getview-postion=1
09-19 10:21:35.697: I/jianghejie(23718): getview-postion=2
09-19 10:21:35.697: I/jianghejie(23718): getview-postion=3
09-19 10:21:35.705: I/jianghejie(23718): getview-postion=4
09-19 10:21:35.705: I/jianghejie(23718): getview-postion=5
09-19 10:21:35.712: I/jianghejie(23718): getview-postion=6
怎么会发生这样的情况呢,我仔细和之前写的一些listview对比,发现和以前的不同之处在布局上,以往我一般都是将listview的高度设置成fill_parent,而这次我是设为wrap_content,这样做的问题在于,ListView没有取到实际的高度,他还要根据计算才能确定,而每一次计算应该会触发listview的渲染,所以就会出现getview的调用次数跟正常情况相比多了好几倍。

所以在一般情况下,我建议把listiview在布局文件中的高度总是设置为:fill_parent(或者match_parent),这不仅仅是getview的调用次数问题,还涉及到布局的效率。

免责声明:文章转载自《解决ListView的getview调用次数多于子view个数的问题》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇JMH 使用指南术语“go”不被识别为cmdlet,函数,脚本文件或可操作程序的名称下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

WPF ListView / ListBox 更新绑定数据源时,自动刷新界面显示

问题现象:ListView 更新绑定数据源时,界面不能自动刷新。 原因及解决方案: 1、ListView 的 ItemSource 使用 BindingList < T >; 注:由于 List < T > 没有实现 INotifyPropertyChanged 接口, 因此若使用 List < T > 作为 ItemS...

Adroid 总结--android ListView美化,个性化更改的属性

首先是stackFromBottom属性,这只该属性之后你做好的列表就会显示你列表的最下面,值为true和falseandroid:stackFromBottom="true"第二是transciptMode属性,需要用ListView或者其它显示大量Items的控件实时跟踪或者查看信息,并且希望最新的条目可以自动滚动到可视范围内。通过设置的控件trans...

Winform ListView 窗体闪烁问题解决

在 winform 编程时, ListView 添加数据时 控件闪烁 , 参考如下解决方法,得到改善。 首先,自定义一个类ListViewNF,继承自System.Windows.Forms.ListView 代码如下: public classListViewNF : System.Windows.Forms.ListView {...

Xamarin.Forms Layout Challenges – Timeline(转载,已翻译)

翻译采用中英对照的方式. 原文地址:http://www.kymphillpotts.com/xamarin-forms-layout-challenges-timeline/ Github地址:https://github.com/kphillpotts/XamarinFormsLayoutChallenges/tree/master/Timeline...

Android ScrollView中嵌套ListView或GidView,导致ListView或GidView无法滚动或显示不全的问题

前言:        按照android的标准,ScrollView中是不能嵌套具有滑动特性的View的,但是如果真的要这样设计,就不得不采用这种怪异的组合方式。 问题:        先说下这种方式如果不做特殊处理时会出现的冲突和问题:         1、在SrollView中嵌套ListView,ListView的显示会有问题,只显示一行或显示效果与...

C#winform中ListView的使用

使用ListView模仿Windows系统的资源管理器界面,实现文件(夹)的浏览、重命名、删除及查询等功能,主要功能界面展示如下: 1.MainForm.cs及MainForm.Designer.cs 1 using System; 2 using System.Collections.Generic; 3 using System....