1
votes

Changer le style de RecyclerAfficher l'article onClick

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é?


0 commentaires

3 Réponses :


0
votes

C'est très simple. En gros, je vous suggère de:

  1. Conservez l'index de votre dernier élément cliqué dans votre adaptateur.
  2. Faites votre coloration uniquement à l'intérieur de onBindViewHolder (et non à l'intérieur de votre onClickListener) en fonction de l'index (par exemple, si l'index a une valeur par défaut comme -1, vous ne colorez pas, s'il a 0..count, vous faites la coloration)
  3. Créez une méthode dans votre adaptateur qui a) stocke le dernier index cliqué dans la variable b) met à jour l'index avec une nouvelle valeur c) appelle notifyItemChanged pour l'ancien index d) appelle notifyItemChanged pour un nouvel index
  4. Appelez la méthode nouvellement créée sous votre onClickListener.

0 commentaires

0
votes

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


0 commentaires

0
votes

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


0 commentaires