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