我正在尝试为我的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 样本存在同样的问题。
答案 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);
}
}
以避免垂头丧气,这比我想要解决的更多。但是,有了这个,我不再看到重复激活的行为。