更新 RecyclerView 中的行内容

Updating row contents in RecyclerView

我正在尝试为我的 RecyclerView 实现选择模式。但是,我在尝试取消选择之前选中的项目时遇到问题。我的方法是这样的:

if (selectedPosition >= 0) {
 RowHolder row = (RowHolder)recyclerView.findViewHolderForAdapterPosition(selectedPosition);
    if (row != null) { 
       row.setChecked(false); 
    }
}

当前显示内容之后的下一个元素(通常是 1 或 2)被取消选择(即,如果 5 个元素可以适合屏幕,则与位置 6 和 7 的元素交互是问题的根源。)

在这种情况下,findViewHolderForAdapterPosition(position) returns 为 null,并且未调用适配器的 onBindViewHolder(RowHolder holder, final int position)。

然而,当所有元素都适合单个预览时(无需滚动即可预览更多项目),一切都会按预期进行。

有人知道什么是解决方案吗?

Commonsware 书籍的读者,RecyclerView/SingleActivatedList 样本也存在同样的问题。

这里似乎确实存在极端情况。通常,滚动到别处并点击一行会按预期执行单个选择。如果受影响的行接近可见(屏幕外 1-2 行),我会得到您描述的效果。我同意你对 findViewHolderForAdapterPosition() 行为的评估,而且这种行为正在恶化。

似乎有效的是更新 onViewAttachedToWindow() 中的激活状态。目前,在我的示例中,这需要相当不愉快的沮丧:

  @Override
  public void onViewAttachedToWindow(T holder) {
    super.onViewAttachedToWindow(holder);

    if (holder.getAdapterPosition()!=choiceMode.getCheckedPosition()) {
      ((RowController)holder).setChecked(false);
    }
  }

我需要稍微改变一下我的 ChoiceCapableAdapter 以避免情绪低落,这比我现在想解决的要多。但是,有了这个,我就再也看不到重复激活的行为了。