Hat jemand, der verwendet RecyclerView
, einen Weg gefunden, um onClickListener
Elemente in der zu setzen RecyclerView
? Ich habe darüber nachgedacht, für jedes Element einen Listener für jedes Layout festzulegen, aber das scheint ein wenig zu mühsam zu sein. Ich bin mir sicher, dass es eine Möglichkeit gibt RecyclerView
, auf das onClick
Ereignis zu hören , aber ich kann es nicht ganz herausfinden.
java
android
android-recyclerview
onclick
onclicklistener
CurtJRees
quelle
quelle
Antworten:
Da sich die APIs radikal geändert haben, würde es mich nicht überraschen, wenn Sie
OnClickListener
für jedes Element eine erstellen würden. Es ist allerdings kein so großer Aufwand. Bei Ihrer Implementierung vonRecyclerView.Adapter<MyViewHolder>
sollten Sie Folgendes haben:Die
onClick
Methode:quelle
onClick()
, gehört zuOnClickListener
kann an jede Ansicht angehängt werden. Die ganze Frage hier ist welche! Bitte bemühen Sie sich, eine Methode wird nicht nur durch einen Namen, sondern zumindest durch eine Klasse identifiziert. Wenn Sie nicht sagen, dass Ihr Code zum Adapter hinzugefügt werden soll, hilft Ihre Antwort nicht wirklich.Hier ist eine bessere und weniger eng gekoppelte Möglichkeit, ein
OnClickListener
for a zu implementierenRecyclerView
.Nutzungsausschnitt:
RecyclerItemClickListener
Implementierung:quelle
Ich mache es auf diese Weise, ohne übermäßige Klassen, Detektoren usw. Einfacher Code in unserem Adapter. Besonders bessere Lösung für longClick als zuvor.
Dann innerhalb eines Fragments oder einer Aktivität einfach drücken:
quelle
Schauen Sie sich eine ähnliche Frage an. @ CommonsWares Kommentar verlinkt darauf , wodurch die
OnClickListener
Schnittstelle in der implementiert wirdviewHolder
.Hier ist ein einfaches Beispiel für
ViewHolder
:Das
Adapter
sieht dann so aus:quelle
ListView
war schon problematisch, wenn man eine Liste komplizierterer Objekte als nur einfacher Zeilen erstellen musste. Was ist, wenn Sie unterschiedliche Ereignisse behandeln müssen, je nachdem, wo Sie auf das Element in der ListView klicken? Du bist beschissen. Hier haben Sie jeweils Zuhörer.getPosition()
ist veraltet, verwendengetAdapterPosition()
odergetLayoutPosition()
stattdessen.Basierend auf der Antwort von Jacob Tabak (+1 für ihn) konnte ich onLongClick Listener hinzufügen:
Dann können Sie es so verwenden:
quelle
public void onRequestDisallowInterceptTouchEvent (boolean disallowIntercept){}
view.getId() == R.id.selection
Das hat bei mir funktioniert. Befestigen Sie die
OnClickListener
an deronBindView
. Ich weiß nicht wirklich, ob sich dies auf die Leistung auswirkt, aber es scheint mit wenig Code gut zu funktionieren.quelle
Dies war so schwierig für mich, einen Listener für Artikelklicks in der Aktivität zu haben und auch einen Klicklistener für eine einzelne Ansicht des Artikels zu haben, der beim Listener für Artikelklicks nicht ausgelöst wird. Nachdem ich mit Jacob Tabaks Antwort herumgespielt habe, respektiere ich seine Antwort für das Klicken auf einen Gegenstand, wenn keine anderen Berührungsaktionen innerhalb des Gegenstands angezeigt werden.
Ich habe einen Brauch
OnClickListener
Oberfläche Ereignis-Klickereignis, das die Ansicht des angeklickten Elements und die Elementposition vom Adapter enthält. Ich präsentiere eine Instanz davon im Konstruktor (oder es kann mit Setter sein) und hänge sie an den View Listener Container Click Listener an.Ich habe auch einen anderen Klick-Listener im Adapter (kann sich im Ansichtshalter befinden), der den aktuellen Ansichts-Klick aus dem Container verarbeitet.
In der Aktivität müssen Sie den Adapter initialisieren, indem Sie die Instanz von übergeben
OnItemClickListener
Und mein ViewHolder
quelle
Dies ist, was ich am Ende brauchte, falls jemand es nützlich findet:
Quelle: http://blog.csdn.net/jwzhangjie/article/details/36868515
quelle
Ich habe eine schöne Lösung für
RecyclerView
'sonItemClickListener
für die Elemente und SubitemsSchritt 1- Erstellen Sie eine Schnittstelle
Schritt 2: Verwenden Sie es dann wie
onBindViewHolder
folgt in der AdaptermethodeSchritt 3: Suchen und Einrichten der Recycler-Ansicht in Aktivität oder Fragment, in der Sie diese verwenden
Schritt 4: Implementieren Sie abschließend die Schnittstelle in Aktivität oder Fragment, in der Sie die Recycling-Ansicht verwenden
quelle
Hier ist was ich getan habe. Diese Lösung unterstützt sowohl onClick als auch onLongClick sowohl für RecyclerView-Elemente als auch für Ansichten innerhalb von RecyclerView-Elementen (interne Ansichten).
Ich tagge viewHolder in den Ansichten meiner Wahl:
Und ich benutze Inhaber.getPosition (), um die Position in der onClick () -Methode abzurufen (onLongClick ist ähnlich):
Eine Variante mit getChildPosition funktioniert ebenfalls. Bitte beachten Sie, dass für die internen Ansichten in onClick () Folgendes verwendet wird:
Meiner Meinung nach besteht der Vorteil dieser Lösung darin, dass beim Klicken auf das Bild nur der Bild-Listener onclick () aufgerufen wird, während bei der Kombination von Jacobs Lösung für eine RecyclerView-Elementansicht und meiner Lösung für interne Ansichten die RecyclerView-Elementansicht onclick ( ) wird auch aufgerufen (wenn Sie auf das Bild klicken).
quelle
Es gibt einen viel einfacheren Weg, dies zu tun. Bewerben Sie sich einfach beim Klicken in der
onBindViewHolder
Stammansicht.Bedenken Sie, dass dies Ihre Ansicht für den Adapter ist.
Folgen Sie dann Ihrem Adapter
quelle
Sie können ein
clickListener
an übergebenAdapter
.In Ihrem
Activity
:dann weitergeben an
Adapter
:In
Adapter
'sonCreateViewHolder
:quelle
holder
Werte absichtlich weiter?Ich habe eine leichte Bibliothek für Android entwickelt, die Sie unter https://github.com/ChathuraHettiarachchi/RecycleClick besuchen können
und folgen Sie für das folgende Beispiel
quelle
Sie können OnClickListener in Ihre ViewHolder-Klasse implementieren
Und onBindViewHolder legt den Artikel Ihres Ansichtsinhabers fest
quelle
Viel zu einfach und effektiv.
Anstatt die Schnittstelle
View.OnClickListener
in View View zu implementieren oder eine Schnittstelle in Ihrer Aktivität zu erstellen und eine Schnittstelle zu erstellen und zu implementieren, habe ich diesen Code zur einfachenOnClickListener
Implementierung verwendet.quelle
Alle bisher veröffentlichten Antworten sind großartige Lösungen. Wenn Sie jedoch nicht mit zu vielen Implementierungsdetails umgehen möchten und möchten, dass diese ähnlich wie ListView funktionieren, würde ich die Verwendung von TwoWay-View empfehlen, wie hier dargestellt:
https://github.com/lucasr/twoway-view
Beachten Sie, dass diese Implementierung auch langes Drücken auf Elemente sowie die Unterstützung für gedrückte Zustände unterstützt (was wichtig ist, dass andere Lösungen für diese Frage fehlen).
Wenn Sie nicht die gesamte Bibliothek verwenden möchten, sehen Sie sich die ClickItemTouchListener- Klasse an, die bei Bedarf als eigenständige Klasse verwendet werden kann. Das einzige Problem, das ich im Moment dabei gefunden habe, ist das lange Drücken + Scrollen. Es scheint ein falsches Verhalten zu haben.
quelle
Wenn Sie das Klickereignis für einzelne Elemente abfangen möchten, implementieren Sie es einfach
OnClickListener
in derViewHolder
Klasse und legen Sie dann die Klick-Listener für einzelne oder ganze Ansichten festitemView
.Das folgende Beispiel zeigt dasselbe
quelle
Für mich ist das der beste Weg:
quelle
Das
RecyclerView
hat keineOnClickListener
und muss es selbst umsetzen.Ich möchte eine
OnItemClickListener
SchnittstelleAdapter
mit eineronClick
Methode hinzufügen , die aufgerufen wird, wenn Sie in der Elementansicht auf klickenViewHolder
. Daher liegt die Verantwortung für die Verwaltung des Klicks auf ein Element außerhalb desViewHolder
undAdapter
. Wird die Aktivität oder das Fragment entscheiden, was zu tun istFügen Sie dem Listener und dem Listener-Objekt eine Schnittstelle hinzu.
Wir erfassen den Klick der Stammansicht des Elements und wenn der Rückruf ausgelöst wird,
onClick
rufen Listener den Adapter an.Da die Aktivität oder das Fragment, in unserem Fall das Fragment, dem Adapter und dem onClick-Rückruf einen Listener zuweist, erhalten wir das ausgewählte Element nach Position und öffnen eine detaillierte Aktivität des Elements.
quelle
Leider
RecyclerView
fehlen einige Funktionen,ListView
die eingebaut waren. Zum Beispiel die Möglichkeit, eine hinzuzufügenOnItemClickListener
, die ausgelöst wird, wenn auf ein Element geklickt wird.RecyclerView
Sie können einenOnClickListener
in Ihrem Adapter festlegen , aber die Weitergabe dieses Klick-Listeners von Ihrem Aufrufcode an den Adapter und an den AdapterViewHolder
ist kompliziert, um einen einfachen Elementklick zu erhalten.Sie müssen auch
R.id.item_click_support
mit ids.xml definieren :Der resultierende Code-Klick-Listener sieht nun folgendermaßen aus:
Eine kurze Erklärung zu den Klicks auf die Recyclingansicht finden Sie in diesem littlerobots_blog
quelle
Sie können setOnClickListener in Ihrer ViewHolder-Klasse wie folgt definieren:
quelle
Hier ist was ich getan habe Lesen Sie mehr und laden Sie das Wesentliche hier herunter
Fügen Sie das gleiche hier hinzu
CustomItemClickListener.java
ItemsListAdapter.java
quelle
Aus den meisten der obigen Antworten geht hervor, dass sie ihre Onclicklistener auf einzelne Elemente einstellen. Die Lösung, die ich anbieten werde, ist jedoch sehr einfach, aber für viele nicht intuitiv. Viele vergessen, dass sich die anderen Komponenten immer in einer übergeordneten Komponente befinden, mit der Elemente in den Listen- oder Recycler-Ansichten angezeigt werden. Bei dieser Lösung geht es nur darum, einen einzelnen On-Click-Listener auf diese übergeordnete Ansicht zu setzen, und der Zug wird gespielt. Die Lösung bietet auch eine Möglichkeit, die Position des Elements, auf das geklickt wird, in der Listen- oder Recycler-Ansicht zu übergeben. Hier ist unsere Hauptansicht eine CardView aus der Android-Support-Bibliothek. Hier ist ein Beispielcode
quelle
Kotlin Umsetzung von Nhaarmans Antwort :
RecyclerItemClickListener.java:
quelle
quelle
quelle
Wir können dies mit schwachen Java-Referenzen tun. Semantisch ist der Ansichtsinhaber derjenige, der auf das Klickereignis reagieren oder es an den richtigen Antwortenden delegieren soll.
Unsere Ziele:
Schritte:
Erstellen Sie eine Schnittstelle für Klickantworten.
Implementieren Sie diese Schnittstelle in der Aktivität, die den Klick verarbeitet.
Fügen Sie dem RecyclerView-Adapter eine Mitgliedsvariable hinzu, die die schwache Referenz und einen Konstruktor enthält, der sie festlegt.
Machen Sie dasselbe im RecyclerView ViewHolder und fügen Sie eine Mitgliedsvariable hinzu, um die Position zu verfolgen.
Stellen Sie Ihre On-Click-Listener auf eine beliebige Ansicht im ViewHolder ein und rufen Sie dann den Responder zurück, um sie zu verarbeiten.
Ändern Sie Ihre onBindViewHolder-Methode, um die Position beim Binden festzulegen.
Geben Sie den Responder an den ViewHolder weiter.
Im Responder können Sie jetzt getId () für die Ansicht verwenden, um herauszufinden, auf welche Ansicht geklickt wurde.
Und hier ist eine Zusammenfassung, damit Sie sehen können, wie alles zusammenpasst: RecyclerView-Klickbehandlung
quelle
Ich bin mir bewusst, dass es viele Antworten gibt, aber ich dachte, ich könnte auch nur meine Implementierung bereitstellen. (Ausführliche Informationen finden Sie auf einer anderen Frage, die ich beantwortet habe ).
Um einen Klick-Listener hinzuzufügen, muss Ihre innere
ViewHolder
Klasse implementiert werdenView.OnClickListener
. Dies liegt daran, dass Sie einenOnClickListener
auf denitemView
Parameter desViewHolder
Konstruktors des Konstruktors setzen. Lassen Sie mich Ihnen zeigen, was ich meine:Die einzigen anderen Dinge, die Sie hinzufügen müssen, sind eine benutzerdefinierte Schnittstelle für Ihre
Adapter
und eine Setter-Methode:Also dein neues, klickunterstützendes
Adapter
abgeschlossen.Jetzt lass es uns benutzen ...
Es ist im Grunde, wie Sie eine normale einrichten würden
Adapter
Methode , außer dass Sie Ihre von Ihnen erstellte Setter-Methode verwenden, um zu steuern, was Sie tun, wenn Ihr Benutzer auf ein bestimmtes Listenelement klickt.Sie können sich auch eine Reihe von Beispielen ansehen, die ich in diesem Gist auf GitHub erstellt habe:
https://gist.github.com/FarbodSalamat-Zadeh/7646564f48ee708c1582c013e1de4f07
quelle
Dies ist, was ich tue, um wiederzuverwenden
OnClickListener
in ViewHoder Nehmen Sie das übergeordnete Element des Elementlayouts
In onBindViewHolder wird das Tag als Position festgelegt
und in Onclick
quelle
Für mich ist der saubere Weg, dies zu tun, dieser.
Adapterkonstruktor
Die verknüpfte Schnittstelle
quelle