更新 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
以避免情绪低落,这比我现在想解决的要多。但是,有了这个,我就再也看不到重复激活的行为了。
我正在尝试为我的 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
以避免情绪低落,这比我现在想解决的要多。但是,有了这个,我就再也看不到重复激活的行为了。