web-dev-qa-db-fra.com

Pourquoi OnClickListener sur un ViewHolder ne fonctionne pas?

J'essaie d'implémenter un moyen de gérer la sélection d'éléments sur un RecyclerView. Personnellement, je n'aime pas la façon suggérée dans certaines réponses sur SO de passer par des gestes, et je pensais que mettre en œuvre un OnClickListener, comme suggéré ici = et ici , était plus propre.

Le fait est que ... ce modèle ne fonctionne pas vraiment! Je ne suis vraiment pas en mesure de comprendre pourquoi mon OnClickListener.onClick N'est jamais appelé. C'est un peu comme si une autre méthode intercepte le clic avant que onClick puisse s'en occuper.

Voici mon code:

    public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
        TextView tvName;
        ImageView star;

        public ViewHolder(View itemView) {
            super(itemView);

            tvName = (TextView) itemView.findViewById(R.id.CHAT_ITEM_name);
            star = (ImageView) itemView.findViewById(R.id.CHAT_ITEM_star);

            Fonts.setTypeface(tvName, regular);
        }

        @Override
        public void onClick(View view) {
            int position = getLayoutPosition();
            select(position);
        }
    }

Malheureusement, il est très important pour moi d'accéder à la position de l'élément cliqué dans l'ensemble de données, afin de le supprimer, donc faire quelque chose comme indexOfChild n'est pas acceptable aussi: j'ai essayé, mais cette méthode donne vous la position de l'élément dans la partie visibile de la liste, rendant ainsi list.remove(position) impossible.

20
Gianluca

En regardant le code mis à jour: vous ne définissez pas onClickListener sur aucune des vues du ViewHolder. C'est une erreur compréhensible d'oublier l'auditeur de clics.

Utilisez simplement:

tvName.setOnClickListener(this);
star.setOnClickListener(this);

Vous pouvez définir les deux ou un seul d'entre eux. Vous pouvez également obtenir simplement la disposition parent de ces deux vues, de sorte que l'élément entier lui-même dans l'adaptateur puisse être cliqué.

itemView.setOnClickListener(this);
48
mobilepotato7

Vous pouvez le faire dans votre onBindViewHolder

         @Override
        public void onBindViewHolder(ReportViewHolder holder, int position {
      holder.itemView.setOnClickListener(new View.OnClickListener() {
        @Override 
        public void onClick(View arg0) { 
        // handle your click here. 
    } }); 
}
2
user2167877