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();
;
}
}
});
}
}
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.