Je souhaite changer la couleur d'un élément dans RecyclerView lorsque je clique dessus. Mais je veux qu'il reste coloré même après le clic .. jusqu'à ce que je clique sur un autre élément (qui devient coloré).
Dans la méthode onBindViewHolder du RecyclerViewAdapter, j'ai essayé ceci: p>
holder.linearlayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
holder.linearlayout.setBackgroundColor(Color.RED);
}
}
Le problème est que si j'essaye de définir la couleur dans la méthode onBindViewHolder, l ' élément reste coloré même après avoir cliqué sur un autre élément, car dans la méthode onBindViewHolder, je ne peux voir que l'élément réel.
Existe-t-il un moyen de remettre tous les éléments dans leur état d'origine (aucun élément coloré) et définir la couleur uniquement sur le dernier élément sur lequel vous avez cliqué?
3 Réponses :
C'est très simple. En gros, je vous suggère de:
C'est simple, Déclarez simplement une variable globale
if(mPreviousIndex==position){
holder.linearlayout.setBackgroundColor(Color.RED); //color on item selecting item
}
else{
holder.linearlayout.setBackgroundColor(Color.WHITE); //color on item unselecting item
}
puis dans votre oncliquez
holder.linearlayout.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mPreviousInde = position //postition- Position of Adapter
}
}
après cela, écrivez ceci dans votre onBindViewHolder
int mPreviousIndex = -1
J'ai créé un exemple d'adaptateur RecyclerView . Vous pouvez remplacer TextView par votre LinearLayout . Vous devez utiliser setBackgroundColor () au lieu de setTextColor()
/**
* Created by beyazid on 11.03.2019.
*/
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.MyViewHolder> {
private Context context;
private LayoutInflater inflater;
private ArrayList<String> list;
private int indexOfColoredItem = -1;
public MyAdapter(Context context, ArrayList<String> list) {
inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
this.context = context;
this.list = list;
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = inflater.inflate(R.layout.my_row_for_recycler_view, parent, false);
return new MyViewHolder(view);
}
@Override
public void onBindViewHolder(final MyViewHolder holder, final int position) {
holder.bindItem(position);
holder.tvDummy.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
indexOfColoredItem = position;
notifyDataSetChanged();
}
});
}
@Override
public int getItemCount() {
return list.size();
}
public class MyViewHolder extends RecyclerView.ViewHolder {
TextView tvDummy;
public MyViewHolder(View itemView) {
super(itemView);
tvDummy = itemView.findViewById(R.id.text);
}
void bindItem(int pos) {
String txt = list.get(pos);
tvDummy.setText(txt);
if(indexOfColoredItem==pos){
tvDummy.setTextColor(ContextCompat.getColor(context, R.color.selectedColor));
} else{
tvDummy.setTextColor(ContextCompat.getColor(context, R.color.yourDefaulColor));
}
}
}
}