【问题标题】:Android: How to make an adapter with stable ids?Android:如何制作具有稳定 ID 的适配器?
【发布时间】:2026-01-06 19:25:01
【问题描述】:

我已经从 BaseAdapter 扩展了我自己的自定义适配器以显示列表视图等...

我希望它支持单选和多选,所以它必须有稳定的 id。我检查了ADAPTER.hasStableIds(),结果是假的。

我已经重写了这个方法,尝试在没有运气的情况下获得马厩 ID。

public long getItemId(int position) {
   return (long) getItem(position).hashCode();
}

知道怎么做吗? 谢谢!

【问题讨论】:

    标签: android listview adapter


    【解决方案1】:

    覆盖 hasStableIds 以返回 true。

    此外,适配器上的数据必须覆盖 hashCode() 或在 getItemId 上返回某种 id 字段。

    【讨论】:

    • 哇,简单易行的解决方案。谢谢!
    • hashCodes 不是唯一的,默认实现使用位置作为 id。 hashCode 与项目标识符的关系如何?
    • @Petr:据我了解,“稳定 ID”意味着您始终能够使用唯一编号来识别您的对象/行(也就是在适配器的生命周期中,ID 永远不会改变) .因此,就像您需要 HashMap 的唯一/不冲突的 hashCode 一样,您可以在 Adapter 中重用 hashCode。
    • 哈希码不保证唯一。同一哈希表(例如 HashMap)中哈希码的唯一性是可取的属性,但不是必需的。我仍然认为在这种情况下不需要覆盖 hashCode()。
    • 现在是最终版。所以不能再覆盖它了。必须调用 setHasStablesIds
    【解决方案2】:

    在你的适配器中添加这个:

    init {    
        setHasStableIds(true)
    }
    

    如果你想将位置设置为 id override getItemId() :

    override fun getItemId(position: Int): Long = position.toLong()
    

    【讨论】:

      最近更新 更多