Listview 子控件重复加载

这是一个常见的listview 资源文件的写法。

listview资源文件
1
2
3
4
5
    <ListView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/listView"
    />

注意到android:layout_height 被设置为wrap_content,这似乎很合理。但如果我们留心的话可以发现,与这个listview 关联的adapter对象的getView()方法被重复调用了好几遍!这对于那些依赖listview 展示大量数据的应用来说,绝对是性能打击。

解决方案:

将这个属性设置为match_parent 或者固定的数值

原因:

通过分析AbsListView 以及Listview的代码,发现答案应该在onMeasure()方法里:由于wrap_content 并没有指定一个固定值,系统需要通过尝试layout来满足wrap_content。每次尝试都会调用onMeasure(),layoutChildren(),使得getView()被重复调用

Comments