[英]How do I change the background of a specific item onClick in a RecyclerView?
我试图在 RecyclerView 中创建一个选定的项目以在单击它时更改其背景,但是一旦单击 RecyclerView 中的另一个项目,该项目的背景将被更改,并且先前单击的项目将变回原始。
第二次单击时,我只能设法将项目更改回原始(白色背景)。
请问有什么帮助吗?
这是我的 RecyclerView 适配器
public class CharityListAdapter extends RecyclerView.Adapter<CharityListAdapter.CharityListViewHolder> {
String charityData[], descriptionData[];
int images[];
Context context;
public CharityListAdapter(Context ct, String charity[], String description[], int image[]) {
context = ct;
charityData = charity;
descriptionData= description;
images = image;
}
@NonNull
@Override
public CharityListViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(context);
View view = inflater.inflate(R.layout.data_row, parent, false);
return new CharityListViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull final CharityListViewHolder holder,final int position) {
holder.titleText.setText(charityData[position]);
holder.descText.setText(descriptionData[position]);
holder.charityImage.setImageResource(images[position]);
holder.charityLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(holder.charityLayout.isSelected()) {
holder.charityLayout.setSelected(false);
System.out.println("Set to false");
} else if(!holder.charityLayout.isSelected()){
holder.charityLayout.setSelected(true);
System.out.println("Set to true");
}
if(holder.charityLayout.isSelected()) {
holder.whiteBox.setBackgroundResource(R.drawable.bluebox);
DonateSelection.enableNextButton();
System.out.println("Blue Box");
}
if(!holder.charityLayout.isSelected()) {
holder.whiteBox.setBackgroundResource(R.drawable.box);
System.out.println("White Box");
}
}
});
}
@Override
public int getItemCount() {
return images.length;
}
public class CharityListViewHolder extends RecyclerView.ViewHolder {
TextView titleText, descText;
ImageView charityImage;
RelativeLayout whiteBox;
RelativeLayout charityLayout;
public CharityListViewHolder(@NonNull View itemView) {
super(itemView);
titleText = itemView.findViewById(R.id.titleText);
descText = itemView.findViewById(R.id.descText);
charityImage = itemView.findViewById(R.id.charityImage);
whiteBox = itemView.findViewById(R.id.whiteBox);
charityLayout = itemView.findViewById(R.id.charityLayout);
}
}
}
这是因为 RecyclerView 的工作方式。 它从您的屏幕上消失后,它会回收您的视图。 您应该使用 if/else 来维护视图的正确状态。 用以下代码替换您的 onClick 操作。
holder.charityLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(holder.charityLayout.isSelected()) {
holder.charityLayout.setSelected(false);
System.out.println("Set to false");
} else {
holder.charityLayout.setSelected(true);
System.out.println("Set to true");
}
if(holder.charityLayout.isSelected()) {
holder.whiteBox.setBackgroundResource(R.drawable.bluebox);
DonateSelection.enableNextButton();
System.out.println("Blue Box");
}else{
holder.whiteBox.setBackgroundResource(R.drawable.box);
System.out.println("White Box");
}
}
});
编辑这里是原始代码。但是,我认为这应该可行。 您应该添加一个由回收器组成的检查状态数组。 默认情况下,它们都是假的。 然后,检查它 onBindViewHolder()。 单击时,将 boolean 设置为 true 并调用 notifyDatasetChanged。
public class CharityListAdapter extends RecyclerView.Adapter<CharityListAdapter.CharityListViewHolder> {
String charityData[], descriptionData[];
int images[]; boolean checkState[];
Context context;
public CharityListAdapter(Context ct, String charity[], String description[], int image[],boolean checkState[]) {
context = ct;
charityData = charity;
descriptionData= description;
images = image;
checkState=checkState;
}
@NonNull
@Override
public CharityListViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(context);
View view = inflater.inflate(R.layout.data_row, parent, false);
return new CharityListViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull final CharityListViewHolder holder,final int position) {
holder.titleText.setText(charityData[position]);
holder.descText.setText(descriptionData[position]);
holder.charityImage.setImageResource(images[position]);
if(checkState[position]){
holder.whiteBox.setBackgroundResource(R.drawable.bluebox);
DonateSelection.enableNextButton();
}else{
holder.whiteBox.setBackgroundResource(R.drawable.box);
}
holder.charityLayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if(checkState[position]){
checkState[position]=false;
}else{
checkState[position]=true;
}
notifyDataSetChanged();
}
});
}
@Override
public int getItemCount() {
return images.length;
}
public class CharityListViewHolder extends RecyclerView.ViewHolder {
TextView titleText, descText;
ImageView charityImage;
RelativeLayout whiteBox;
RelativeLayout charityLayout;
public CharityListViewHolder(@NonNull View itemView) {
super(itemView);
titleText = itemView.findViewById(R.id.titleText);
descText = itemView.findViewById(R.id.descText);
charityImage = itemView.findViewById(R.id.charityImage);
whiteBox = itemView.findViewById(R.id.whiteBox);
charityLayout = itemView.findViewById(R.id.charityLayout);
}
}
}
与其记住您选择的布局/ViewHolder,不如记住选择的位置。 在您的适配器中添加:
private int positionSelected = -1;
-1 表示没有选择。
然后,在您的 ViewHolder 构造函数中:
public CharityListViewHolder(@NonNull View itemView) {
super(itemView);
....
charityLayout = itemView.findViewById(R.id.charityLayout);
charityLayour.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
positionSelected = getAdapterPosition();
notifyDataSetChanged();
}
});
}
在您的 onBindViewHolder 中,您可以相应地设置背景:
if (position == positionSelected) {
// Set background for layout to indicate selected
} else {
// Set background for layout to indicate unselected
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.