Android使用position = 0多次调用MyAdapter.bindView;怎么避免这个?

时间:2013-12-09 00:03:09

标签: android performance android-layout

我正在开发一个扩展ListAdapter的类,我对它的性能不满意。我正在尝试改善我的应用程序的流动性,并且我已经将此适配器的bindView识别为滞后源。

我的布局是一个项目网格,大小相同。我希望为网格中的每个可见项调用一次bindView()。相反,当我追踪Cursor.getPosition()的值时,我看到很多调用position = 0,然后对网格中的每个可见项进行一次调用。这让我感到困惑,并且显然浪费了UI线程上的宝贵周期。我推测Android正在调用bindView(position = 0)来测量布局,但我实际上并不知道这里发生了什么。显然我做错了什么,但我还不知道是什么。

Android试图为我做什么,以及如何修改我的代码以避免此行为?是否有一种直接的方法来缩短测量周期,告诉Android,“嘿 - 我知道这些项目都将是相同的大小 - 你只需要做一个测量通过”?任何帮助将不胜感激。< / p>

1 个答案:

答案 0 :(得分:1)

正如评论所建议的那样,如果使用AT_MOST高度模式(通常对应于wrap_content)来测量列表/网格,但这也可能由于其他原因而发生 - 嵌套{{1例如,} / match_parent配置,然后通常会执行额外的测量。

但是,您应该努力保持wrap_content / getView代码路径非常便宜。无论什么时候,系统都会调用它,但在快速挥动过程中,这种情况也会自然发生。布局期间的情况不会影响您,如果您在这些代码路径中也足够快以处理通常的投掷。

另外要小心你在项目视图中异步更改的内容,例如对ImageViews的bindView调用以响应异步加载任务等。 ListView和GridView在setImageDrawable期间为任何设置都有快速路径,但是在带外更改事物通常会触发布局。有很多方法可以保持这种速度,但是你需要保持大小不变​​这样做。