今天在做项目的时候发现了一个比较奇怪的问题,是关于ListView的,即ListView的android:height属性会影响程序中ListView的getView()方法的调用次数,如果设置ListView的android:height属性为0dp,同时设置android:weight=1,或者直接设置android:height属性为"wrap_content",那么ListView在展示数据的时候,getView()被执行的次数并不会是传入数据集合的size,而会比size的值大一些甚至大数倍,但是如果把ListView的android:height属性设置为match_parent的话,getView()被执行的次数就正好是传入数据集合的size。
那么此现象会对程序造成什么影响呢,我在做项目的过程中受到的影响是——如果ListView的android:height属性不为"match_parent"时,那么当ListView条目中有CheckBox需要根据数据自动被选中时,会造成错乱,而且每次重新进入此界面,ListView条目中CheckBox被选中的情况都是不一样的,我只是发现了这一种影响,但是我猜想还存在其它的一些影响。
通过在网上查阅了相关资料,对此种现象的解释大概是这样的:
我们一般都是将ListView的android:height属性设置为match_parent,这样就可以在程序中直接测量出ListView的实际高度,但是如果我们将高度属性设置为wrap_content,或者0dp(同时设置weight为1),则将导致ListView的实际高度无法测量,还需要一些计算才能确定ListView的实际高度,而在计算过程中会触发ListView的渲染,在渲染的时候getView()将会多次被调用,这样就导致getView()被调用的次数是传入数据集合大小的数倍。
因此在实际项目中,最好是把ListView的高度属性设置为match_parent,这样能够优化程序的效率。