Android 如何在RecyclerView中单击特定项目时更改其背景?

Android 如何在RecyclerView中单击特定项目时更改其背景?,android,android-recyclerview,Android,Android Recyclerview,我正在尝试使RecyclerView中的选定项目在单击时更改其背景,但一旦单击RecyclerView中的其他项目,该项目的背景将更改,先前单击的项目将更改回原始项目 我只在第二次单击时将项目更改回原始(白色背景) 需要帮忙吗 这是我的RecyclerView适配器 public class CharityListAdapter extends RecyclerView.Adapter<CharityListAdapter.CharityListViewHolder> { S

我正在尝试使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);


        }

    }
}

公共类CharityListAdapter扩展了RecyclerView.Adapter{ 字符串charityData[],descriptionData[]; int图像[]; 语境; public CharityListAdapter(上下文ct,字符串charity[],字符串描述[],整数图像[]){ 上下文=ct; 慈善数据=慈善; descriptionData=描述; 图像=图像; } @非空 @凌驾 public CharityListViewHolder onCreateViewHolder(@NonNull ViewGroup父级,int-viewType){ LayoutFlater充气机=LayoutFlater.from(上下文); 视图=充气机。充气(R.layout.data\u行,父项,false); 返回新的CharityListViewHolder(视图); } @凌驾 BindViewHolder上的公共无效(@NonNull final CharityListViewHolder,final int position){ holder.titleText.setText(慈善数据[职位]); holder.descText.setText(描述数据[位置]); holder.charityImage.setImageResource(图像[位置]); holder.charityLayout.setOnClickListener(新视图.OnClickListener(){ @凌驾 公共void onClick(视图v){ if(holder.charityLayout.isSelected()){ holder.charityLayout.setSelected(假); System.out.println(“设置为false”); }如果(!holder.charityLayout.isSelected()),则为else{ holder.charityLayout.setSelected(真); System.out.println(“设置为真”); } if(holder.charityLayout.isSelected()){ 持有者.白盒.立根资源(R.可抽出.蓝盒); DonateSelection.enableNextButton(); System.out.println(“蓝框”); } 如果(!holder.charityLayout.isSelected()){ 支架.白盒.立根资源(R.可拔模盒); System.out.println(“白盒”); } } }); } @凌驾 public int getItemCount(){ 返回图像长度; } 公共类CharityListViewHolder扩展了RecyclerView.ViewHolder{ text查看titleText,descText; 图像查看慈善图像; 相对白盒; 相关慈善机构布局; public CharityListViewHolder(@NonNull View itemView){ 超级(项目视图); titleText=itemView.findviewbyd(R.id.titleText); descText=itemView.findviewbyd(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");
                    }



                }
            });
已编辑 这是原始代码。但是,我认为这应该行得通。您应该添加一个由recycler组成的检查状态数组。默认情况下,它们都将为false。然后,在BindViewHolder()上检查它。单击时,将布尔值设置为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);


        }

    }
}
公共类CharityListAdapter扩展了RecyclerView.Adapter{ 字符串charityData[],descriptionData[]; int图像[];布尔检查状态[]; 语境; public CharityListAdapter(上下文ct、字符串charity[]、字符串描述[]、整数图像[]、布尔检查状态[]){ 上下文=ct; 慈善数据=慈善; descriptionData=描述; 图像=图像; checkState=checkState; } @非空 @凌驾 public CharityListViewHolder onCreateViewHolder(@NonNull ViewGroup父级,int-viewType){ LayoutFlater充气机=LayoutFlater.from(上下文); 视图=充气机。充气(R.layout.data\u行,父项,false); 返回新的CharityListViewHolder(视图); } @凌驾 BindViewHolder上的公共无效(@NonNull final CharityListViewHolder,final int position){ holder.titleText.setText(慈善数据[职位]); holder.descText.setText(描述数据[位置]); holder.charityImage.setImageResource(图像[位置]); 如果(检查状态[位置]){ 持有者.白盒.立根资源(R.可抽出.蓝盒); DonateSelection.enableNextButton(); }否则{ 支架.白盒.立根资源(R.可拔模盒); } holder.charityLayout.setOnClickListener(新视图.OnClickListener(){ @凌驾 公共void onClick(视图v){ 如果(检查状态[位置]){ checkState[位置]=假; }否则{ checkState[位置]=真; } notifyDataSetChanged(); } }); } @凌驾 public int getItemCount(){ 返回图像长度; } 公共类CharityListViewHolder扩展了RecyclerView.ViewHolder{ text查看titleText,descText; 图像查看慈善图像; 相对白盒; 相关慈善机构布局; public CharityListViewHolder(@NonNull View itemView){ 超级(项目视图); titleText=itemView.findviewbyd(R.id.titleText); descText=itemView.findViewById(R.id.descText)
private int positionSelected = -1;
        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();
                }
            }); 
        }
if (position == positionSelected) {
    // Set background for layout to indicate selected
} else {
    // Set background for layout to indicate unselected
}