我有一个CardViews的RecyclerView。我正在尝试在CardViews之一上单击它,它会更改该CardView的背景。这部分有效。我被卡住的地方是试图将所有其他CardViews都改回白色,这样看起来就不会像选择了多个一样。
我觉得最好的方法是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循环。
答案 0 :(得分:4)
通常,您应该以这样的方式编写适配器: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
}
...
}
您可以通过仅通知适配器旧的点击位置和新的点击位置已更改(以便您不必重新绑定每个视图)来改善此情况,但是为了简单起见,我将其保留了下来就这样。
答案 1 :(得分:0)
您应该在模型中有一个final File file = File('${_localPath}output.pdf');
try {
http.Response response = await http.get(
'$pdfUrl?property_id=153',
headers: {
'Content-Type': 'application/json',
},
);
await file.writeAsBytes(response.bodyBytes);
} catch (e) {
print(e);
}
之类的字段,对于所有列表项,都将其设置为false。
将其传递给适配器。
在适配器中检查isSelected
中的条件:
onBindViewHolder
无论何时单击项目更改,都只需反转字段项目,即,将其设为false则为true或为true时为false。
if (list.get(i).isSelected) {
// change background to black
} else {
// change background to white
}
答案 2 :(得分:0)
for (int x = recyclerView.getChildCount(), i = 0; i < x; ++i) {
ViewHolder holder = recyclerView.getChildViewHolder(recyclerView.getChildAt(i));
}
答案 3 :(得分:0)
for (int x = recyclerView.getChildCount(), i = 0; i < x; ++i) {
RecyclerView.ViewHolder holder = recyclerView.getChildViewHolder(recyclerView.getChildAt(i));
TextView txtAbc0 = holder.itemView.findViewById(R.id.txt_abc0);
TextView txtAbc1 = holder.itemView.findViewById(R.id.txt_abc1);
txtAbc0.setText("abc0="+i);
txtAbc1.setText("abc1="+i);
}