在RecyclerView中更新行内容

时间:2015-11-17 11:06:21

标签: android android-recyclerview commonsware-cwac

我正在尝试为我的RecyclerView实施一个选择模式。但是,我在尝试取消选择以前检查过的项目时遇到问题。我的方法如下:

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

当当前呈现的下一个元素(通常为1或2)受到取消选择时(即如果5个元素可以放入屏幕,然后与位置6和7处的元素进行交互),则会出现问题。问题。)

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

然而,当所有元素都适合单个预览时(不需要滚动来预览更多项目),事情按预期工作。

任何人都知道什么可以解决这个问题?

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

1 个答案:

答案 0 :(得分:0)

这里似乎有一个边缘案例。通常,在其他地方滚动并点击一行会按预期执行单个选择。如果受影响的行接近可见(屏幕外1-2行),我会得到您描述的效果。我同意你对T行为的评估,这种行为正在恶化。

似乎有用的是更新findViewHolderForAdapterPosition()中的激活状态。目前,在我的样本中,这需要一个相当不愉快的向下倾斜:

onViewAttachedToWindow()

我需要稍微改变我的 @Override public void onViewAttachedToWindow(T holder) { super.onViewAttachedToWindow(holder); if (holder.getAdapterPosition()!=choiceMode.getCheckedPosition()) { ((RowController)holder).setChecked(false); } } 以避免垂头丧气,这比我想要解决的更多。但是,有了这个,我不再看到重复激活的行为。