Ich ersetzt meine ListView
mit RecyclerView
, die Liste zeigt ok, aber ich würde gerne wissen , wie geklickten Artikel zu erhalten und seine Position, ähnlich dem Verfahren OnItemClickListener.onItemClick(AdapterView parent, View v, int position, long id)
wir in verwenden ListView
.
Danke für Ideen!
Antworten:
Basierend auf dem Link: Warum hat RecyclerView nicht onItemClickListener ()? und wie unterscheidet sich RecyclerView von Listview? und auch @ Duncans allgemeine Idee, ich gebe hier meine Lösung:
Definieren Sie eine Schnittstelle
RecyclerViewClickListener
zum Weiterleiten der Nachricht vom Adapter anActivity
/Fragment
:In
Activity
/Fragment
implementieren Sie die Schnittstelle und übergeben Sie den Listener an den Adapter:In
Adapter
undViewHolder
:Nach dem Testen funktioniert es gut.
[ UPDATE ]
Da API 22
RecyclerView.ViewHoler.getPosition()
veraltet ist, also stattdessen mitgetLayoutPosition()
.quelle
private static RecyclerViewClickListener itemListener;
im Konstruktor statisch auf die Statik.onBindViewHolder
. Außerdem war mein Listenelement nicht alle anklickbar (nur ein Teil des Elements).new MyRecyclerViewAdapter(context, this)
? Dies könnte zu Speicherlecks führenpublic void recyclerViewListClicked(View v, int position);
Der Modifikatorpublic
ist für Schnittstellenmethoden redundantquelle
Hier ist ein Beispiel zum Festlegen eines Klick-Listeners.
quelle
int position = getAdapterPosition();
Fügen Sie diesen Code dort ein, wo Sie die Recycler-Ansicht in Aktivität definieren.
Dann machen Sie eine separate Klasse und geben Sie diesen Code ein:
quelle
Erstellen Sie eine Java-Datei mit dem folgenden Code
Verwenden Sie einfach den Listener für Ihr RecyclerView-Objekt.
quelle
RecyclerItemClickListener
ist keine Standard-Android-Klasse, Sie sollten die Bibliothek, die Sie verwenden, oder die Klasse selbst bereitstellen.Wenn Sie das Click-Ereignis von recycle-View aus Aktivität / Fragment anstelle des Adapters wünschen, können Sie auch die folgende Abkürzung verwenden.
Sie können auch andere lange Wege wie die Verwendung der Schnittstelle verwenden
quelle
quelle
Verwenden Sie den folgenden Code: -
quelle
RecyclerView bietet keine solche Methode.
Um Klickereignisse in RecyclerView zu verwalten, habe ich beim Binden des ViewHolder onClickListener in meinem Adapter implementiert: In meinem ViewHolder behalte ich einen Verweis auf die Stammansicht (wie Sie es mit Ihren ImageViews, TextViews usw. tun können) und beim Binden the viewHolder Ich habe ein Tag mit Informationen festgelegt, die ich für den Umgang mit Klicks (z. B. Position) und einem Klicklistener benötige
quelle
Ich habe auch das gleiche Problem konfrontiert.
Ich wollte die Position des angeklickten / ausgewählten Elements in RecyclerView () ermitteln und einige bestimmte Vorgänge für dieses bestimmte Element ausführen.
Die Methode getAdapterPosition () funktioniert wie ein Zauber für solche Dinge. Ich fand diese Methode nach einem Tag langer Forschung und nachdem ich zahlreiche andere Methoden ausprobiert hatte.
Sie müssen keine zusätzliche Methode verwenden. Erstellen Sie einfach eine globale Variable mit dem Namen 'position' und initialisieren Sie sie mit getAdapterPosition () in einer der Hauptmethoden des Adapters (Klasse oder ähnlich).
Hier ist eine kurze Dokumentation von diesem Link .
Freue mich zu helfen. Fühlen Sie sich frei, Zweifel zu stellen.
quelle
Meine einfache Lösung
Positionieren oder platzieren Sie einfach die Daten, die Sie für die Aktivität benötigen.
Adapterkonstruktor:
In Aktivität:
Im Adapter onClickLictener im Element
in onBindViewHolder
Wenn Sie jetzt die Position in RecyclerView ändern, wird sie im Halter gehalten (oder sollte als Listener bezeichnet werden).
Ich hoffe es wird nützlich sein
Mein erster Beitrag; P.
quelle
quelle
Versuchen Sie es auf diese Weise
Adapterklasse:
}}
In Ihrer Aktivität oder Ihrem Fragment:
Hinweis: Implementieren Sie den OnItemClickListener basierend auf dem von Ihnen in Aktivitäts- oder Fragment- und Überschreibungsmethoden angegebenen Kontext.
quelle
Jedes Mal, wenn ich einen anderen Ansatz verwende. Personen scheinen eine Ansicht in einer Ansicht zu speichern oder zu positionieren, anstatt einen Verweis auf ein Objekt zu speichern, das von ViewHolder angezeigt wird.
Ich verwende stattdessen diesen Ansatz und speichere ihn einfach in ViewHolder, wenn onBindViewHolder () aufgerufen wird, und setze den Verweis in onViewRecycled () auf null.
Jedes Mal, wenn ViewHolder unsichtbar wird, wird es recycelt. Dies wirkt sich also nicht auf den großen Speicherverbrauch aus.
quelle
Die kurze Erweiterung für die Kotlin-
Methode gibt die absolute Position aller Elemente zurück (nicht die Position nur der sichtbaren Elemente).
Und Nutzung
quelle
Verwenden Sie getLayoutPosition () in Ihrer Java-Methode für benutzerdefinierte Schnittstellen. Dadurch wird die ausgewählte Position eines Elements zurückgegeben. Überprüfen Sie alle Details auf
https://becody.com/get-clicked-item-and-its-position-in-recyclerview/
quelle
Im Designer können Sie die
onClick
Eigenschaft des listItem auf eine Methode festlegen, die mit einem einzelnen Parameter definiert wurde. Ich habe eine Beispielmethode unten definiert. Die Methode getAdapterPosition gibt Ihnen den Index des ausgewählten listItem.Informationen zum Einrichten einer RecyclerView finden Sie in der Dokumentation hier: https://developer.android.com/guide/topics/ui/layout/recyclerview
quelle
quelle
Nach vielen Versuchen und Irrtümern stellte ich fest, dass es eine sehr einfache Möglichkeit gibt, dies zu tun, indem ich eine Schnittstelle in der Adapterklasse erstelle und diese in Fragmente implementiere. Jetzt kommt die Wendung Fragment Jetzt können Sie die Daten von dieser Funktion an viemodel und von dort überall senden.
Ich weiß nicht, ob diese Methode eine gute Codierungsmethode ist, aber bitte lassen Sie es mich im Kommentar wissen. Wenn jemand dies sehen möchte, lassen Sie es mich im Kommentarbereich wissen. Ich öffne regelmäßig den Stackover-Flow.
quelle
Wenn Sie Kotlin verwenden
quelle
Setzen Sie in onViewHolder onClickListiner auf eine beliebige Ansicht und klicken Sie in der Seite auf diesen Code:
Toast.makeText (Drawer_bar.this, "position" + position, Toast.LENGTH_SHORT) .show ();
Ersetzen Sie
Drawer_Bar
durch Ihren Aktivitätsnamen.quelle