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:
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é.
3 Réponses :
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.
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.
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?
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
@azurefrog revoir la question pour que vous puissiez comprendre.
Avez-vous essayé de passer le nouveau
OnItemClickListeneràartistaAdapterdans son constructeur? Il semble que vous enregistrez uniquement l'auditeur avec laViewlà-bas, et non dansSetOnItemClickListener ().@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/]