web-dev-qa-db-fra.com

En cliquant sur un élément par programme dans RecyclerView

Je charge une liste de catégories et, selon ce qui est sélectionné, je dois afficher les produits de la catégorie correspondante dans la RecyclerView. Ainsi, lorsque je lance pour la première fois la Fragment, je dois simuler l'utilisateur en cliquant dans une catégorie par défaut - dans ce cas, ce serait le premier.

Comment puis-je effectuer cela?

18
noloman

Sans votre code, nous ne savons pas comment vous implémentez votre onClickListener.

Normalement, vous implémentez et définissez l'élément onClickListener dans le viewHolder de votre RecyclerView.Adapter.
Par exemple: ViewHolder.itemView.setOnClickListener(listener);

Donc, la solution est que vous pouvez utiliser recyclerView.findViewHolderForAdapterPosition(0).itemView.performClick()

PS: Ne pas utiliser findViewHolderForLayoutPosition() selon le Doc

19
Xiaoyi LI

Voici une solution de contournement pour sélectionner le 1er enfant de RecyclerView après le réglage de l’adaptateur.

//position to be clicked
final int pos = 0;
new Handler().postDelayed(new Runnable() {
                    @Override
                    public void run() {
recyclerView.findViewHolderForAdapterPosition(pos).itemView.performClick();
                    }
                },1);
14
Saurabh

Il est désapprouvé par les puristes d’utiliser cette méthode.

    recyclerView.findViewHolderForAdapterPosition(pos).itemView.performClick();

comme il est dit dans docs:

Renvoie le ViewHolder pour l'élément à la position donnée du jeu de données. Contrairement à {@link #findViewHolderForLayoutPosition (int)}, cette méthode prend en compte toutes les modifications en attente de l'adaptateur qui peuvent ne pas encore être reflétées dans la présentation. Par contre, si {@link Adapter # notifyDataSetChanged ()} a été appelé mais que la nouvelle présentation n'a pas encore été calculée, cette méthode renverra null car les nouvelles positions des vues sont inconnues jusqu'à ce que la présentation soit calculée . pour exactement la raison pour laquelle retarder avec un fil est parfois utile. Tout appel à notifyDataSetChanged () le renvoie à null. Il est préférable d’utiliser la méthode onBindViewHolder de l’adaptateur et de vérifier la position 0. Ajustez la manière dont vous avez configuré votre écouteur. La méthode habituellement est donnée ici, créée dans le constructeur ViewHolder. Utilisez une variable init pour empêcher son rappel:

    @Override
    public void onBindViewHolder(FooAdapter.ViewHolder viewHolder, int position) {
     //code
     ...
     //do this last especially if you are using an animator

     if(position == 0 && isInit) {
        listener.onItemClick( viewHolder.itemView,0);
        isInit =false;

     }
  }
2
Droid Teahouse

si vous voulez cliquer sur une vue particulière dans une rangée à la position, utilisez

recyclerView.findViewHolderForAdapterPosition(pos).itemView.findViewById(R.id.view_id).performClick();
0
ked