【问题标题】:Recycler View (with Data Binding Position is wrong after ScrollingRecycler View(滚动后数据绑定位置错误
【发布时间】:2022-12-12 20:53:01
【问题描述】:

我使用带有数据绑定的 Recycler View 来显示路由列表。对于测试,总是(并且只有)10 个项目(Route1 -10)每个 Route 都有一个删除按钮,用于删除用户选择的行(从列表和 RV)。在不滚动的情况下删除第一个或第二个项目时,它工作得很好,我可以删除所有项目。但是在滚动之后,(我认为)适配器将 Position 设置为错误的值并删除了错误的项目。最终程序因 IndexOutOfBoundsException 而崩溃。

我尝试使用其他位置而不是内部位置我从适配器得到:

holder.absoluteAdapterPosition holder.adapterPosition holder.bindingAdapterPosition holder.layoutPosition

不幸的是,它并没有改变结果。

然后我试了:Kotlin RecyclerView delete item. Is this a bug? 效果更好,但在删除列表的最后一项后,适配器位置再次损坏。

最后,我为适配器的视图持有者中的删除按钮编写了 onClicklistener。 现在它有效,但我不明白为什么。有人可以向我解释这种行为吗?

【问题讨论】:

    标签: android kotlin


    【解决方案1】:

    如果没有看到您正在使用的特定代码就很难说,但问题可能与 RecyclerView 在列表中添加和删除项目时更新其视图位置的方式有关。当您滚动时,RecyclerView 会回收不再可见的视图并为其分配新的位置,如果您的代码未设计为正确处理这些更改,这可能会导致问题。

    此问题的一种解决方案是使用 RecyclerView.ViewHolder 的 getAdapterPosition() 方法获取项目在适配器数据集中的当前位置,而不是使用传递给 onBindViewHolder 方法的位置。这将确保您始终拥有正确的位置,即使在滚动或修改数据集之后也是如此。

    正如您提到的,另一种解决方案是在 ViewHolder 中使用 onClickListener。这是可行的,因为 ViewHolder 持有对项目当前位置的引用,因此 onClickListener 将始终可以访问正确的位置。

    通常,在使用 RecyclerView 时务必小心,并确保您的代码旨在正确处理数据集和视图位置的变化。如果您仍然遇到问题,您可能希望发布您的代码以供其他人查看并提供更具体的建议。

    【讨论】:

      猜你喜欢
      • 2019-11-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-06
      • 2015-10-18
      • 2018-02-11
      • 1970-01-01
      • 2010-10-31
      • 1970-01-01
      相关资源
      最近更新 更多