【问题标题】:How to use RecyclerView.Adapter notifyItemInserted/Removed in a right way?如何正确使用 RecyclerView.Adapter notifyItemInserted/Removed?
【发布时间】:2019-03-26 16:26:03
【问题描述】:

例如,您有一个适配器,并在 onBindViewHolder 方法中将 OnClickListener 设置为某些视图(并根据视图位置在那里执行一些操作)。您应该将 final 分配给方法 onBindViewHolder 的位置参数,以便可以从 onClick() 访问它。

更改数据集(删除或添加列表中的项目)后,您调用 onItemInserted 或 onItemRemoved,这确实会在 recyclerview 中添加/删除视图,但它不会刷新其他视图项,因此当您单击邻居视图项时,它将打开一个屏幕或显示无效索引的数据。为了避免这种情况,我基本上调用 notifyDatasetChanged 来调用 onBind 到所有可见视图并删除/添加一些视图。

那么当您调用 notifyItemInserted/removed 时如何刷新其他视图或如何适当地使用这些方法?

【问题讨论】:

  • 不应该这样。它工作正常。如果您遇到错误的索引问题,请发布您的代码。理想情况下应该是list.remove(position); 然后是notifyItemRemoved(position);。这对我来说很好。
  • 你应该使用viewHolder.getAdapterPosition()而不是自己保留最终位置
  • 删除项目后使用 notifyItemRangeChanged(0,list.size());...它会工作
  • @DavidMedenjak 你是对的!请将您的评论转换为答案,我会接受它

标签: android android-recyclerview


【解决方案1】:

如果在未调用notifyDataSetChanged 的情况下插入或删除数据集中的项目,将位置分配给onBindViewHolder 中的变量将导致状态不一致。

要使用onItemInsertedonItemRemoved,视图中的数据应该保持一致,因为它不会被重绘并且onClick 将使用分配的这个无效位置在添加或删除项目之前 .

对于这个和其他用例,RecyclerView.ViewHolder 提供了访问其位置和 ID 的方法:

使用getAdapterPosition()getItemId() 获取有效的职位和ID。

还可以查看RecyclerView.ViewHolder 中提供的其他方法。

【讨论】:

    【解决方案2】:

    所以,我解决问题的方法是将position 更改为viewHolder.getAdapterPosition()

    干杯!

    【讨论】:

      【解决方案3】:

      我建议您在适配器内插入或删除列表后添加 notifyItemRangeChanged。这适用于我的项目。

      删除项目示例:

      public void removeItem (int pos) {        
              simpanList.remove(pos);
              notifyItemRemoved(pos);
              notifyItemRangeChanged(pos, simpanList.size());//add here, this can refresh position cmiiw
          }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多