我有一个 CardView 的 RecyclerView。我试图在您单击其中一个 CardView 的地方使用它,它会更改该 CardView 的背景。这部分有效。我陷入困境的是尝试将所有其他 CardView 更改回白色,这样看起来就不会选择多个。
我觉得最好的方法是使用 for 循环,但我似乎找不到 for 循环应该是什么。我还尝试使用
notifyDataSetChanged()
重置所有 CardView,但这也不起作用。
这是我的
onItemClicked()
函数(工作正常):
mAdapter = new TransferCard(list, getContext(), new TransferCard.OnItemClickListener() {
@Override
public void onItemClick(View v, int position) {
//What code goes here to change all Views in the RecyclerView to have a background of white
RelativeLayout temp = v.findViewById(R.id.cardForeground);
item = list.get(position);
temp.setBackgroundColor(getResources().getColor(R.color.selected));
}
});
这是我的
onCreateViewHolder()
setOnTouchListener()
活动所在的位置。
@Override
public MyViewHolder onCreateViewHolder(final ViewGroup parent, int viewType) {
View itemView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.transfer_card, parent, false);
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
listener.onItemClick(v, parent.indexOfChild(v));
}
});
return new MyViewHolder(itemView);
}
看来我就在那里,但我需要知道如何处理 for 循环。
for (int x = recyclerView.getChildCount(), i = 0; i < x; ++i) {
ViewHolder holder = recyclerView.getChildViewHolder(recyclerView.getChildAt(i));
}
Kotlin 解决方案:
myRecyclerView.children.forEach { childView ->
val holder = myRecyclerView.getChildViewHolder(childView) as? MyViewHolder
}
一般来说,您应该以这样的方式编写适配器:
onBindViewHolder()
是您修改视图的唯一地方。对于您想要做的事情,我认为最简单的方法是跟踪最后点击的位置,然后根据其位置是否等于最后一个位置将背景设置为黑色或白色点击位置。onBindViewHolder()
@Override
public void onItemClick(View v, int position) {
lastTappedPosition = position;
mAdapter.notifyDataSetChanged();
}
您可以通过仅通知适配器旧的点击位置和新的点击位置已更改来对此进行改进(这样您就不必重新绑定每个视图),但为了简单起见,我将其保留为-是。
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
if (position == lastTappedPosition) {
// set color selected
} else {
// set color unselected
}
...
}
的字段,将所有列表项设置为 false。
isSelected
中的状况:
onBindViewHolder
if (list.get(i).isSelected) {
// change background to black
} else {
// change background to white
}