我有一个RecyclerView,它显示从数据库派生的一系列视图。我想确认用户已经通过突出显示其边缘来选择其中一个视图,并且我已经成功地这样做了。如果用户继续选择不同选项,我希望删除原始选择中的突出显示。这是我遇到了一些麻烦的地方。直接从RecyclerView访问ViewHolder,按位置
最初的亮点并不是什么问题,因为我是在内部做的。但是,我不知道如何使用适配器位置访问以前的视图。我一直在搜索StackOverflow大约一个小时,因为我无法在Android API或谷歌上找到很多东西。许多用户似乎提出了类似的问题,但最终,细微的差异使任何有用的答案都无效。
里面我ViewHolder
,这是我RecyclerView
的内部public class
,我有一个OnClickListener
如下:
@Override
public void onClick(View view) {
if(!selected) {
selected = true;
view.setBackgroundResource(R.drawable.default_selection_background);
} else {
selected = false;
view.setBackgroundResource(0);
}
UpdateSelected(getAdapterPosition());
}
这点回到我的RecyclerView
,并坦率地说,我还没有添加任何的工作代码我的UpdateSelected(int position)
方法。
如果有帮助,我打算把它的功能是这样的:
void UpdateSelected(int position) {
if(position != currentlySelected) {
ViewHolder[currentlySelected].Deselect();
}
}
public class ViewHolder extends RecyclerView.ViewHolder {
...
public void Deselect() {
// and from here, I can go on as normal.
}
}
我已经注意到了用户的建议他人使用getLayoutPosition()
来推导UI目的位置,除非他们特别希望继续工作内部数据,这是我打算做的。
如何从我的RecyclerView使用其位置访问特定的ViewHolder?
太棒了!奇迹般有效。我必须做的只是在'onBindViewHolder'中,它立即可以访问'view'。我只是使用'viewHolder.itemView.setBackgroundResource(backgroundRes)'。为了提高效率,我也只在'previousSelection'和'currentSelection'上使用'notifyItemChanged',但非常感谢。 – Gnemlock
我也面临同样的问题。所以我尝试这个解决方案,但在我的情况下没有工作。 @Gnemlock –
我只是偶然发现了这个答案,虽然不错,但我建议将'notifyDataSetChanged()'更改为'notifyItemChanged(selectedPosition)'。 当您可以精确地告诉适配器需要更新哪些视图时,避免调用notifyDataSetChanged()是个好习惯。 –