Android listview 自定义 adapter getView()方法重复调用多次

发布时间:2018-06-12作者:laosun阅读(3587)

Android

Android listview 自定义 adapter getView()方法重复调用多次,解决方式就是把listview的android:layout_width 和 android:layout_height 布局的高度都改成 fill_parent 或者 match_parent

    今天在研究android listview 自定义 Adapter的时候发现getView重复调用了多次,网上找了一些资料现在解决了。

    解决办法就是把 listview 的 android:layout_width 和 android:layout_height 布局的高度都改成 fill_parent 或者 match_parent 即可解决这个问题,fill_parent 目前最新版本已经不支持使用了,那就 match_parent

    原因就是 listview 的 android:layout_width和android:layout_height布局 设置成 wrap-content,会计算父控件的高度所以造成了一种反复调用情况,从而次数不确定。

    更深层次的解释为:

    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,这个过程会更加漫长。

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


0 +1

版权声明

 源码  android

 请文明留言

0 条评论