1
votes

Android: meilleur moyen de définir OnClickListener sur chaque élément d'affichage dans RecyclerView

J'essaie actuellement de définir un onClickListner pour chaque élément de la liste dans mon RecyclerView. Je me demandais quelle méthode était la meilleure pour cela et les avantages et les inconvénients de chacune.

J'ai trouvé deux façons. Celui-ci semble plus simple:

RecyclerView onClick

Ils ajoutez-le à chaque élément de la méthode onCreateViewHolder ()

private final OnClickListener mOnClickListener = new MyOnClickListener();

@Override
public MyViewHolder onCreateViewHolder(final ViewGroup parent, final int viewType) {
    View view = LayoutInflater.from(mContext).inflate(R.layout.myview, parent, false);
    view.setOnClickListener(mOnClickListener);
    return new MyViewHolder(view);
}

La méthode de cet article me semble plus déroutante qui consiste à créer une interface dans le adapter la classe et l'implémenter dans le fichier Activity:

https : //medium.com/androiddevelopers/android-data-binding-recyclerview-db7c40d9f0e4

Quel serait l'avantage de le faire de cette façon?


0 commentaires

3 Réponses :


2
votes

Je réponds en fonction de ce que j'ai compris.

Il y a deux endroits où vous pouvez joindre l'auditeur.

OnCreateViewHolder

Cette fonction est appelée chaque fois que recyclerview ne peut réutiliser aucune vue existante et doit gonfler une nouvelle vue. N'oubliez pas que recyclerview réutilise les vues qui sont floues.

onBindViewHolder

Cette fonction est appelée chaque fois qu'une vue apparaît à l'écran et que recyclerview souhaite que vous ajoutiez le contenu approprié à cette vue.

Donc à ces deux fonctions, vous avez accès à votre vue et vous pouvez définir des écouteurs de clic, la seule différence est que dans onCreateViewHolder vous n'avez pas accès à la position de l'élément (rappelez-le ne crée pas de vue pour chaque position, il pourrait réutiliser des vues floues) et dans onBindViewHolder vous avez accès à la position de l'élément.

Donc, fondamentalement, si vous avez besoin de la position de l'élément pour lequel la vue est cliquée, vous devez la définir dans onBindViewHolder sinon vous pouvez la définir dans onCreateViewHolder .

J'espère que cela vous aidera! Sinon, veuillez ajouter un commentaire.


0 commentaires

1
votes

Définissez l'écouteur de clic dans onCreateViewHolder ou onBindViewHolder si vous devez utiliser l'événement de clic dans la classe Adapter uniquement, par exemple, en supprimant un élément et en notifiant l'adaptateur ou affichez simplement Toast . La seule différence est que vous obtenez position dans onBindViewHolder .

La deuxième approche d'utilisation de l'interface et de sa mise en œuvre dans Activity / Fragment est pour les cas où vous devez recevoir l'événement de clic dans ces classes parentes. Vous transmettez l'instance d'interface de Activity / Fragment à la classe d'adaptateur et la méthode d'interface est appelée au clic. Pour une meilleure compréhension, vous pouvez envisager le cas où vous devez effectuer un appel API ou appeler une fonction ViewModel / Controller en cliquant sur un élément de l'adaptateur.

Ainsi, les deux cas sont valides en fonction de votre cas d'utilisation. J'espère que ça aide :)


0 commentaires

1
votes

En effet, la meilleure approche serait d'attacher ClickListner au onBindViewHolder , comme la méthode est appelée une fois pour chaque enfant de la recyclerview . Consultez cet extrait de code:

@Override
public void onBindViewHolder(@NonNull ViewHolder holder, final int position) {
    final Contact contact = contactListFiltered.get(position);
    holder.tvContactName.setText(contact.personUri.toString());
    holder.tvContactNo.setText(contact.number);
    holder.civContactPic.setImageBitmap(contact.photo);
    holder.cvContactItem.setOnClickListener(v -> Utils.shortToast("" + contact.id, context));
}

En cliquant, il affichera l'ID de contact de chaque enfant de recyclerview dans un toast. D'un autre côté, si vous ajoutez ClickListner à onCreateViewHolder , vous ne pouvez pas détecter l'élément sur lequel on clique et il agit de la même manière pour chaque enfant de recyclerview , ce que je ne pense pas que vous vouliez. Je vous suggère donc d'ajouter votre ClickListner à onCreateViewHolder.


0 commentaires