您的位置:首页 > 其它

Listview对次调用getView方法原因解析以及解决方法

2014-12-28 22:55 344 查看
当我们在使用ListView的时候,在自定义Adapter的时候,有时候getView()会重复调用,有时候会调用很多次,严重影响效率,这和ListView本身在android上的机制有关。

在布局上,我们只有一个listview的时候,如果listView的高为wrap_content,getView()会重复调用多次,把高设置成match_parent,getView()调用一次。如果这时候getView()还重复调用,那就看Listview的上一级的高是不是也是设置也match_parent的,如果不是,也将ListView 的上一级设置成match_parent。

官方的解释是:

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

所以,解决方法就是尽量避免自适应,除非是万不得已,固定大小或者填充的效果会比较好一些。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐