Android 在回收视图中更改卡的颜色

Android 在回收视图中更改卡的颜色,android,android-recyclerview,Android,Android Recyclerview,我正在尝试在安卓系统中制作一个应用程序,当点击时,我需要将cardview的颜色更改为灰色。我已经通过使用下面的代码做到了这一点,但我不知道如何使所有其他cardview的颜色恢复为白色 例如,当单击索引3处的cardview时,它应变为灰色;当单击索引5处的card view时,索引3处的cardview应将其颜色变回白色,只有索引5处的cardview应变为灰色 @NonNull @Override public Myviewholder onCreateViewHo

我正在尝试在安卓系统中制作一个应用程序,当点击时,我需要将cardview的颜色更改为灰色。我已经通过使用下面的代码做到了这一点,但我不知道如何使所有其他cardview的颜色恢复为白色

例如,当单击索引3处的cardview时,它应变为灰色;当单击索引5处的card view时,索引3处的cardview应将其颜色变回白色,只有索引5处的cardview应变为灰色

    @NonNull
    @Override
    public Myviewholder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
        View v = layoutInflater.inflate(R.layout.add_recycle_layout , parent , false);
        return new Myviewholder(v , onCatClick , list.size());
    }

    @Override
    public void onBindViewHolder(@NonNull Myviewholder holder, int position) {
        if(textView == null)
            return;
        textView.setText(list.get(position).getName());
        img.setImageResource(list.get(position).getIcon());
    }

    @Override
    public int getItemCount() {
        return list.size();
    }

    public static class Myviewholder extends RecyclerView.ViewHolder implements View.OnClickListener{

        ImageView img;
        TextView textView;
        onCatClick onCatClick;
        CardView cardView;
        int size;
        public Myviewholder(@NonNull View itemView , onCatClick onCatClick , int size) {
            super(itemView);
            img = itemView.findViewById(R.id.recycle_layout_image);
            textView  = itemView.findViewById(R.id.recycle_layout_text);
            this.onCatClick = onCatClick;
            itemView.setOnClickListener(this);
            cardView = itemView.findViewById(R.id.recycle_layout_card);
            this.size = size;
        }

        @Override
        public void onClick(View v) {
            onCatClick.onCatClicked(getAdapterPosition());
            System.out.println("clicked" + getAdapterPosition());
            cardView.setCardBackgroundColor(Color.parseColor("#e0e0e0"));


        }
    }
    public interface onCatClick{
        void onCatClicked(int position);
    }


您需要在
Myviewholder

用这个

@Override
public void onBindViewHolder(@NonNull Myviewholder holder, int position) {
    
    holder.textView.setText(list.get(position).getName());
    holder.img.setImageResource(list.get(position).getIcon());
}
而不是这个

 @Override
public void onBindViewHolder(@NonNull Myviewholder holder, int position) {
    if(textView == null)
        return;
    textView.setText(list.get(position).getName());
    img.setImageResource(list.get(position).getIcon());
}
尝试此方法更改选定项目的颜色

像这样做一个pojo类

public class MoodSelection
{
   
    boolean isSelected;
    

    public boolean isSelected() {
        return isSelected;
    }

    public void setSelected(boolean selected) {
        isSelected = selected;
    }
}
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.core.content.ContextCompat;
import androidx.recyclerview.widget.RecyclerView;

import com.google.android.material.card.MaterialCardView;
import com.moodmedic.R;
import com.moodmedic.activity.ui.mood_fragment.MoodSelection;

import java.util.ArrayList;

import de.hdodenhof.circleimageview.CircleImageView;

public class SelectMoodAdapter extends RecyclerView.Adapter<SelectMoodAdapter.ViewHolder> {

    private Context mContext;
    private ArrayList<MoodSelection> arrayList = new ArrayList<>();

    public SelectMoodAdapter(Context mContext, ArrayList<MoodSelection> arrayList) {
        this.mContext = mContext;
        this.arrayList = arrayList;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(mContext).inflate(R.layout.row_select_mood_list_layout, parent, false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {

        if (arrayList.get(position).isSelected()) {
            holder.rootView.setCardBackgroundColor(ContextCompat.getColor(mContext, R.color.colorAccent2));
        } else {
            holder.rootView.setCardBackgroundColor(ContextCompat.getColor(mContext, R.color.colorWhite));

        }

        

        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                for (int i = 0; i < arrayList.size(); i++) {
                    arrayList.get(i).setSelected(false);
                }
                arrayList.get(position).setSelected(true);
                notifyDataSetChanged();
            }
        });
    }

    @Override
    public int getItemCount() {
        return arrayList.size();
    }

    public static class ViewHolder extends RecyclerView.ViewHolder {
        
        MaterialCardView rootView;

        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            
            rootView = itemView.findViewById(R.id.rootView);
        }
    }
}
现在像这样在适配器类中使用它

public class MoodSelection
{
   
    boolean isSelected;
    

    public boolean isSelected() {
        return isSelected;
    }

    public void setSelected(boolean selected) {
        isSelected = selected;
    }
}
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.core.content.ContextCompat;
import androidx.recyclerview.widget.RecyclerView;

import com.google.android.material.card.MaterialCardView;
import com.moodmedic.R;
import com.moodmedic.activity.ui.mood_fragment.MoodSelection;

import java.util.ArrayList;

import de.hdodenhof.circleimageview.CircleImageView;

public class SelectMoodAdapter extends RecyclerView.Adapter<SelectMoodAdapter.ViewHolder> {

    private Context mContext;
    private ArrayList<MoodSelection> arrayList = new ArrayList<>();

    public SelectMoodAdapter(Context mContext, ArrayList<MoodSelection> arrayList) {
        this.mContext = mContext;
        this.arrayList = arrayList;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(mContext).inflate(R.layout.row_select_mood_list_layout, parent, false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {

        if (arrayList.get(position).isSelected()) {
            holder.rootView.setCardBackgroundColor(ContextCompat.getColor(mContext, R.color.colorAccent2));
        } else {
            holder.rootView.setCardBackgroundColor(ContextCompat.getColor(mContext, R.color.colorWhite));

        }

        

        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                for (int i = 0; i < arrayList.size(); i++) {
                    arrayList.get(i).setSelected(false);
                }
                arrayList.get(position).setSelected(true);
                notifyDataSetChanged();
            }
        });
    }

    @Override
    public int getItemCount() {
        return arrayList.size();
    }

    public static class ViewHolder extends RecyclerView.ViewHolder {
        
        MaterialCardView rootView;

        public ViewHolder(@NonNull View itemView) {
            super(itemView);
            
            rootView = itemView.findViewById(R.id.rootView);
        }
    }
}
导入android.content.Context;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.TextView;
导入androidx.annotation.NonNull;
导入androidx.core.content.ContextCompat;
导入androidx.recyclerview.widget.recyclerview;
导入com.google.android.material.card.MaterialCardView;
导入com.moodmedic.R;
导入com.moodmedic.activity.ui.mood_fragment.MoodSelection;
导入java.util.ArrayList;
导入de.hdodenhof.circleimageview.circleimageview;
公共类SelectMoodAdapter扩展了RecyclerView.Adapter{
私有上下文;
私有ArrayList ArrayList=新ArrayList();
public SelectMoodAdapter(上下文mContext,ArrayList ArrayList){
this.mContext=mContext;
this.arrayList=arrayList;
}
@非空
@凌驾
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent,int viewType){
视图=布局更平坦。从(mContext)。充气(R.layout.row\u select\u mood\u list\u布局,父级,false);
返回新的ViewHolder(视图);
}
@凌驾
public void onBindViewHolder(@NonNull ViewHolder,int位置){
if(arrayList.get(position.isSelected()){
setCardBackgroundColor(ContextCompat.getColor(mContext,R.color.colorAccent2));
}否则{
holder.rootView.setCardBackgroundColor(ContextCompat.getColor(mContext,R.color.colorWhite));
}
holder.itemView.setOnClickListener(新视图.OnClickListener(){
@凌驾
公共void onClick(视图){
对于(int i=0;i
@MaskedCarrot check更新答案我添加了另一个示例代码