【问题标题】:Why does Wrap_Content fire BindView more than once为什么 Wrap_Content 会多次触发 BindView
【发布时间】:2011-07-04 05:02:50
【问题描述】:

我正在开发一个带有 listView 的 Android 应用程序,并且正在对其进行优化。它在一个活动中使用自定义光标适配器,我注意到 bindview() 为列表的每一行触发了两次。在这里研究 BindView() 和 NewView() 方法时,我在一篇文章中读到,将 Wrap_Content 用于我的列表视图的宽度是一个坏主意。我将它切换到 Fill_Parent 和 viola 现在 bindview() 和 newview() 只为每个项目触发一次。

为了更好地理解 Andorid OS 的内部结构,我想知道为什么 Wrap_Content 会导致 bindview() 多次触发。

我在 Google、android 开发者文档和这里进行了几次搜索,但都没有运气。

非常感谢任何回应。

谢谢, 乔治

【问题讨论】:

    标签: android android-layout


    【解决方案1】:

    如果我从 Google I/O 的视频中没记错的话,将 ListView 的宽度(或高度)设置为 wrap_content 将导致它测量前 3 个项目并以此为基础确定其尺寸。为了测量前 3 个项目,它必须调用 bindView() 来填充它们。测量完成后,它将完全填充并在前 3 个和任何后续对象上再次调用 bindView()

    这是因为ListView 仅在列表中可能有无限数量的项目时才会将屏幕上的内容保存在内存中。它不是为wrap_content 设计的最大项目,因为它可能会永远停留在绘图阶段。

    【讨论】:

    • 正确,我昨天回答了类似的question。那里提供了视频/时间。
    • 是的,这是正确的。 ListView 有时会出于测量目的调用适配器的 getView。无法保证对 getView 的任何调用的结果都会显示在屏幕上,或者最近对 getView 的调用与当前显示的内容完全相关。
    • 感谢格伦登的回答。正是我想要的。
    猜你喜欢
    • 2018-08-31
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-08
    • 1970-01-01
    相关资源
    最近更新 更多