我在我的应用中有一个recyclerview,我显示的列表项很简单a textView cardView ,当我单击任何显示的文本视图时,这将是我稍后将与之合作的选择的项目。
想法是,如果我单击其中的任何一个,则包含它的卡视图应该更改bgcolor,例如颜色口音。
问题是,一旦我更改了CardView的bgcolor,那么当我单击RecyClerview的任何其他文本视图时,我就不知道该如何做。
我正在使用的代码:
@Override
public void onBindViewHolder(final ViewHolder holder, final int position) {
holder.name.setText(mNames.get(position));
int favIndex = copyDatas.get(position).fieldNames.indexOf("fav");
boolean fav = (boolean) copyDatas.get(position).values.get(favIndex);
if (fav) {
holder.fav.setVisibility(View.VISIBLE);
holder.notfav.setVisibility(View.GONE);
} else {
holder.notfav.setVisibility(View.VISIBLE);
holder.fav.setVisibility(View.GONE);
}
holder.name.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(mContext, "Choosen: " + mNames.get(position), Toast.LENGTH_SHORT).show();
String entity_name = mNames.get(position);
holder.cardView.setCardBackgroundColor(mContext.getColor(R.color.colorAccent));
}
});
}
我想做的基本上是:当我单击它们时(holder.name.name.setonclicklistener ...(,它应该遍历每个循环系统项目,然后将其bgcolor重置为主颜色
您需要记住选择哪个位置。然后,您可以有条件地改变OnBindViewHolder
中的背景int selectedPosition = 0;
@Override
public void onBindViewHolder(final ViewHolder holder, final int position) {
holder.name.setText(mNames.get(position));
int favIndex = copyDatas.get(position).fieldNames.indexOf("fav");
boolean fav = (boolean) copyDatas.get(position).values.get(favIndex);
if (fav) {
holder.fav.setVisibility(View.VISIBLE);
holder.notfav.setVisibility(View.GONE);
} else {
holder.notfav.setVisibility(View.VISIBLE);
holder.fav.setVisibility(View.GONE);
}
if (position == selectedPosition){
holder.cardView.setCardBackgroundColor(mContext.getColor(R.color.colorAccent));
}
else{
holder.cardView.setCardBackgroundColor(mContext.getColor(R.color.otherColor));
}
holder.name.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(mContext, "Choosen: " + mNames.get(position), Toast.LENGTH_SHORT).show();
String entity_name = mNames.get(position);
selectedPosition = position;
getadapter().notifydatasetchanged();
}
});
}
在更新RecyclerAdapter
中的项目时,应使用适配器的notify
方法之一。在您的情况下,您正在跟踪所选项目,当用户选择新项目时,您只需要更新先前选择的项目即可。
如果您的ViewHolder
在您的适配器中,则可以创建一个方法和变量,可以轻松处理此操作。
public class MyAdapter {
// keeping track of the currently selected item
private int selected = -1;
public void updateSelectedItem(int position) {
int previous = selected;
selected = position;
// tell the adapter to re-render the two positions to redraw their backgrounds
notifyItemChanged(previous);
notifyItemChanged(selected);
}
public class MyViewHolder {
@Override
public void onBindViewHolder(final ViewHolder holder, final int position) {
if(selected == position) {
// show a selected background
} else {
// show the normal background
}
holder.name.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
// notify the adapter the selected item has changed.
updateSelectedItem(position);
}
});
}
}
}