setCardBackgroundColor on a RecyclerView with CardView

1.3k views Asked by At

First of all ignore some texts are not in engilsh.Well I was trying to change mi cards colors when it is pressed.The result is that the card changes the color the problem is that some other cards changes the color as well.

I am using an spareBoleanArray ->selections

Here is my adapter:

private class DotesAdapter extends RecyclerView.Adapter<DotesAdapter.DoteViewHolder> implements Filterable {

    private ListaDotes mValues;
    private DotesAdapter.DoteFilter mFilter;



    public  DotesAdapter(ListaDotes items){
        mValues=items;
        mFilter= new DotesAdapter.DoteFilter(DotesAdapter.this);


    }

    @Override
    public DotesAdapter.DoteViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.card,parent,false);
        return new DotesAdapter.DoteViewHolder(v);
    }

    @Override
    public void onBindViewHolder(DotesAdapter.DoteViewHolder holder, int position) {

        holder.Titulo.setText(mValues.get(position).getTitulo());

        String s;
        int t = mValues.get(position).getTipo();
        if(t==0)
            s= "GENERALES";
        else
        if(t==1)s= "FORTALEZA";
        else
        if(t==2)s= "REFLEJOS";
        else
        if(t==3)s= "VOLUNTAD";
        else
        if(t==4)s= "PRECISIÓN";
        else
        if(t==5)s= "ATAQUE";
        else
            s= "SOBRENATURALES";

        holder.Tipo.setText(s);



         if(selections.get(position,false))
           holder.myBackground.setCardBackgroundColor(Color.RED);



    }

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

    @Override
    public Filter getFilter() {
        // if(doteFilter == null)
        //   doteFilter = new DoteFilter(this, listaDotes);
        return mFilter;
    }

Here is my ViewHolder:

public   class DoteViewHolder extends RecyclerView.ViewHolder {

        TextView Titulo;
        TextView  Tipo;

        CardView myBackground;
        DotesAdapter adapter;

        public DoteViewHolder(final View itemView) {
            super(itemView);
            Titulo=(TextView) itemView.findViewById(R.id.titulo);
            Tipo=(TextView) itemView.findViewById(R.id.tipo);

            myBackground =(CardView) itemView.findViewById(R.id.card);


            itemView.setLongClickable(true);
            itemView.setOnLongClickListener(new View.OnLongClickListener() {
                @Override
                public boolean onLongClick(View v) {


                    Intent intent = new Intent(CrearPersonajeDotes.this,DoteView.class);
                    //Bundle b = new Bundle();
                    //b=filteredList.get(getAdapterPosition()).toString();
                    YoYo.with(Techniques.Flash).duration(200).playOn(v);
                    intent.putExtra("Dote", getAdapterPosition());
                    intent.putExtra("Call",1);
                    startActivity(intent);
                    return true;
                }
            });

            itemView.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
//HERE I CHANGE THE COLOR OF THE CARD TO RED IF THE POSITION OF THE ARRAYS IS ON TRUE OR BLUE IN THE OTHER CASE
                    if(!selections.get(getAdapterPosition(),false)) {

                        myBackground.setCardBackgroundColor(Color.RED);
                        selections.put(getAdapterPosition(),true);
                        Dote d = listaDotes.get(getAdapterPosition());
                        MainCrearPersonaje.NPersonaje.addDote(d);
                        UpdatePDText();


                    }

                    else{

                        myBackground.setCardBackgroundColor(Color.BLUE);
                        selections.put(getAdapterPosition(),false);
                        Dote d = listaDotes.get(getAdapterPosition());
                        MainCrearPersonaje.NPersonaje.removeDote(d);
                        UpdatePDText();


                        ;


                    }

                }
            });
        }
    }
2

There are 2 answers

2
Karakuri On BEST ANSWER

You need code in onBindViewHolder() to set the color. What happens is when the view is recycled, it still has the color from the last time it was used, so you need to properly reset the color when you bind new data to it.

int color = selections.get(position,false) ? Color.RED : Color.BLUE;
holder.myBackground.setBackgroundColor(color);
0
Ekundayo Blessing Funminiyi On
//this line contains a logical error. it will evaluate to false when it 
//actually true...remove the ! and it should work fine
if(!selections.get(getAdapterPosition(),false))