【问题标题】:What does having BaseAdapter.hasStableIds() return true solve?让 BaseAdapter.hasStableIds() 返回真正的解决方案是什么?
【发布时间】:2014-11-30 03:05:11
【问题描述】:

我一直试图了解BaseAdapter.hasStableIds() 的工作原理。

根据我的阅读,从此方法返回true 有助于适配器确定是否必须重新创建视图或保持不变。我猜适配器以某种方式将位置映射到 id,如果映射保持不变,当调用 notifyDataSetChanged() 时适配器什么也不做。

但如果数据已更改而id(和位置)保持不变,这不是问题吗?如果这确实是一个问题,那么究竟什么时候返回真正的帮助?

【问题讨论】:

    标签: android baseadapter


    【解决方案1】:

    hasStableIds() == true 表示基础数据项的项 ID 不会更改,而不是该项的数据永远不会更改。例如。同一个联系人具有相同的 ID,无论它出现在列表中的哪个位置,但其名称可能会随着时间而改变——用户可以对其进行编辑、添加昵称等。可以想象在每个项目没有某个稳定 ID 的情况下显示数据(也许数据不是您的,您无法访问适合从 getItemId() 返回的唯一 ID,例如与 long 返回类型不兼容)。

    在浏览AdapterViewAbsListView 的源代码时,在我看来,这在您在ListView/GridView 上设置选择模式时最有用,因为这样视图可以更有效地管理已选中项目 ID 和它们是可视状态,包括跨数据集更改,其中这些已检查项目可能已移动到新位置(但它们具有相同的 ID)。

    【讨论】:

    • 感谢您的解释。你能看看这个:Android - what is the meaning of StableIDs?吗?那么给出的答案是错误的吗?
    • 说实话,我不是 100% 确定的。 ListView 尤其是 Android 中最复杂的视图类之一,其背后的代码需要相当长的时间才能理解。我想在回收视图方面可能会有一些优化,但这对我来说似乎很奇怪; ListView 应该在notifyDataSetChanged 之后为它想要显示的每一行调用getView(),以便您在每一行中填充数据...
    • ListView 应该在 notifyDataSetChanged 之后为它想要显示的每一行调用 getView() 是什么让你这么认为?
    猜你喜欢
    • 2014-04-08
    • 2011-07-05
    • 2018-04-02
    • 2012-01-25
    • 2018-08-30
    • 1970-01-01
    • 2013-07-03
    • 2019-03-09
    相关资源
    最近更新 更多