2
votes

android studio: l'aide RecyclerView Click ne fonctionne pas

J'essaie de créer un événement de clic à partir de RecyclerView dans la classe Main, mais il n'attrape pas le clic.

Interface

artistaAdapter.setOnItemClickListener(new OnItemClickListener() {
    @Override
    public void onItemClick(int posicao) {
        Log.d("TESTE", "CLIQUE CURTO" +posicao);
    }

    @Override
    public void onItemLongClick(int posicao) {
        Log.d("TESTE", "CLIQUE LONGO" +posicao);
    }
});

attribut d'interface et setter

public class ViewHolderArtista extends RecyclerView.ViewHolder{

    public ViewHolderArtista(@NonNull View itemView,  final OnItemClickListener listener) {
        super(itemView);

        itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(listener != null){
                    int position = getAdapterPosition();
                    if(position != RecyclerView.NO_POSITION){
                        listener.onItemClick(position);
                    }
                }
            }
        });

        itemView.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View v) {
                if (listener != null){
                    int position = getAdapterPosition();
                    if (position != RecyclerView.NO_POSITION){
                        listener.onItemLongClick(position);
                    }
                }
                return true;
            }
        });
    }

}

class ViewHolder

private OnItemClickListener mlistener;

public void setOnItemClickListener(OnItemClickListener listener){
    mlistener = listener;
}

implémentation dans la classe main:

public interface OnItemClickListener {
    void onItemClick(int posicao);
    void onItemLongClick(int posicao);
}

Cependant, rien ne se passe en cliquant:

 empty log when clicked

c'est-à-dire que j'implémente l'événement click de RecyclerView dans la classe principale, mais cela ne fonctionne pas , il n'attrape pas la position de l'élément cliqué.


6 commentaires

@azurefrog revoir la question pour que vous puissiez comprendre.


Avez-vous essayé de passer le nouveau OnItemClickListener à artistaAdapter dans son constructeur? Il semble que vous enregistrez uniquement l'auditeur avec la View là-bas, et non dans SetOnItemClickListener () .


@azurefrog oui j'ai essayé, mais de cette façon je trouve cela plus pratique et plus facile parce que je reçois juste l'événement de clic spécifique. Seulement cela ne fonctionne pas, plusieurs tutoriels le font et cela fonctionne, sauf le mien :(


quelqu'un aide?


Avez-vous vérifié si vous envoyez correctement l'auditeur ?. Essayez de commenter le if (listener! = Null) {.


Vous devriez faire une recherche sur google, c'est populaire [ antonioleiva.com/recyclerview-listener/]


3 Réponses :


0
votes


2 commentaires

si j'utilise cette méthode, comment l'utiliserais-je dans la classe principale?


mon intention est d'utiliser l'événement click dans la classe principale ou dans tout autre.



0
votes

N'UTILISEZ PAS D'ÉCOUTEURS CLIC DANS LA CLASSE VIEWHOLDER

il retournera toujours null car il ne s'initialise pas.

Utilisez des écouteurs de clic dans la méthode onBindViewHolder () de l'adaptateur de recyclage.


6 commentaires

si j'utilise cette méthode, comment l'utiliserais-je dans la classe principale?


mon intention est d'utiliser l'événement click dans la classe principale ou dans tout autre.


créer un adaptateur dans la classe principale et il devrait être facile de l'implémenter


C'est ce que j'ai fait comme je l'ai montré dans la question, mais l'instanciation de l'adaptateur ne montre que les fonctions créées dans le ViewHolder et non dans le onBindViewHolder. Si vous pouvez être plus clair, je vous remercie.


Laissez-moi deviner que vous voulez accéder à la classe principale lorsque vous effectuez un événement de clic droit ??. Que créer un adaptateur dans l'activité principale. Si vous souhaitez accéder à des méthodes ou des vues spécifiques, vous pouvez l'obtenir


Pardonnez-moi, mais je ne comprends toujours pas. Pourriez-vous donner un exemple?



0
votes

Vous pouvez faire comme les autres l'ont dit en définissant l'auditeur dans onBindViewHolder , ou j'ai une classe pour les actions recyclerView comme onClick et onLongClick.

import android.support.v7.widget.RecyclerView;
import android.view.View;

public class ItemClickSupport {
    private final RecyclerView mRecyclerView;
    private OnItemClickListener mOnItemClickListener;
    private OnItemLongClickListener mOnItemLongClickListener;
    private View.OnClickListener mOnClickListener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            if (mOnItemClickListener != null) {
                // ask the RecyclerView for the viewHolder of this view.
                // then use it to get the position for the adapter
                RecyclerView.ViewHolder holder = mRecyclerView.getChildViewHolder(v);
                mOnItemClickListener.onItemClicked(mRecyclerView, holder.getAdapterPosition(), v);
            }
        }
    };
    private View.OnLongClickListener mOnLongClickListener = new View.OnLongClickListener() {
        @Override
        public boolean onLongClick(View v) {
            if (mOnItemLongClickListener != null) {
                RecyclerView.ViewHolder holder = mRecyclerView.getChildViewHolder(v);
                return mOnItemLongClickListener.onItemLongClicked(mRecyclerView, holder.getAdapterPosition(), v);
            }
            return false;
        }
    };
    private RecyclerView.OnChildAttachStateChangeListener mAttachListener
            = new RecyclerView.OnChildAttachStateChangeListener() {
        @Override
        public void onChildViewAttachedToWindow(View view) {
            // every time a new child view is attached add click listeners to it
            if (mOnItemClickListener != null) {
                view.setOnClickListener(mOnClickListener);
            }
            if (mOnItemLongClickListener != null) {
                view.setOnLongClickListener(mOnLongClickListener);
            }
        }

        @Override
        public void onChildViewDetachedFromWindow(View view) {

        }
    };

    private ItemClickSupport(RecyclerView recyclerView) {
        mRecyclerView = recyclerView;
        // the ID must be declared in XML, used to avoid
        // replacing the ItemClickSupport without removing
        // the old one from the RecyclerView
        mRecyclerView.setTag(R.id.item_click_support, this);
        mRecyclerView.addOnChildAttachStateChangeListener(mAttachListener);
    }

    public static ItemClickSupport addTo(RecyclerView view) {
        // if there's already an ItemClickSupport attached
        // to this RecyclerView do not replace it, use it
        ItemClickSupport support = (ItemClickSupport) view.getTag(R.id.item_click_support);
        if (support == null) {
            support = new ItemClickSupport(view);
        }
        return support;
    }

    public static ItemClickSupport removeFrom(RecyclerView view) {
        ItemClickSupport support = (ItemClickSupport) view.getTag(R.id.item_click_support);
        if (support != null) {
            support.detach(view);
        }
        return support;
    }

    public ItemClickSupport setOnItemClickListener(OnItemClickListener listener) {
        mOnItemClickListener = listener;
        return this;
    }

    public ItemClickSupport setOnItemLongClickListener(OnItemLongClickListener listener) {
        mOnItemLongClickListener = listener;
        return this;
    }

    private void detach(RecyclerView view) {
        view.removeOnChildAttachStateChangeListener(mAttachListener);
        view.setTag(R.id.item_click_support, null);
    }

    public interface OnItemClickListener {

        void onItemClicked(RecyclerView recyclerView, int position, View v);
    }

    public interface OnItemLongClickListener {

        boolean onItemLongClicked(RecyclerView recyclerView, int position, View v);
    }
}  

N'oubliez pas d'importer .R


0 commentaires