RecyclerView - erhalten Sie Position im inneren Tätigkeit eher als RecyclerViewAdapter
Es ist mein Dritter Tag jetzt im Zusammenhang mit der Handhabung meiner Ansicht klickt. Ich war ursprünglich mit ListView
, dann wechselte ich zu RecyclerView
. Ich habe android:onclick
Elemente zu jeder Kontrolle über mein row_layout
und ich bin den Umgang mit Ihnen in meiner MainActivity
wie diese:
public void MyMethod(View view) {}
In meiner alten ListView
Umsetzung, die ich getan habe setTag(position)
in der Lage sein, um es in MyMethod
dadurch ist es innen:
Integer.parseInt(view.getTag().toString())
Dies funktioniert gut, ohne Probleme. Aber jetzt bin ich den Umgang mit RecyclerView
und gezwungen sind, verwenden Sie die ViewHolder
, die nicht bieten eine setTag
Methode. Nach der Suche für 2 Stunden, ich habe gefunden, dass Menschen setTag
wie diese:
holder.itemView.setTag(position)
War dies akzeptabel. Obwohl, wenn ich versuche, den Wert aus der MyMethod
- Funktion mit der Zeile:
Integer.parseInt(view.getTag().toString())
Stürzt die Anwendung ab. Ich habe gelesen, mehrere Umsetzung der onclick-handling in den adapter, die funktioniert, aber muss ich das MainActivity
denn ich bin mit etwas, das einzigartig ist die Aktivität.
TL;DR ich will zum senden der position der angeklickten Zeile zu meiner MainActivity
in einer einfachen Art und Weise.
Edit: ich entschuldige mich für die Verwirrung, da mein Thema war nicht sehr gründlich. Ich habe eine RecyclerView
und einen adapter. Der adapter ist mit meinen row_layout
. Diese row_layout
xml hat eine Wurzel LinearLayout
. Im inneren gibt es eine TextView
, andere LinearLayout
(die hat zwei TextViews
) und eine Button
(für die Einfachheit). Ich will nicht leiden für den Umgang mit den Klicks auf RecylerView
wie ich mit der ListView
. Also habe ich beschlossen, fügen Sie ein android:onclick
für jedes Steuerelement, dann link TextView
und LinearLayout
auf eine einzige Methode und Verknüpfung der Button
(und Zukunft Button
s), um Ihre einzigartigen Methoden. Was mir fehlt ist, dass ich in der Lage sein möchten zu sagen, die position auf jeder der empfangenden Methoden auf meine MainActivity
. Wenn ich muss link alles, was kommt vom adapter und geht in den MainActivity
zu einem einzigen onclick-handler, so dass es sein. Obwohl, wie würde ich sagen, die Kontrolle, feuerte die klicken Sie auf?
Edit 2: Die angeforderte layout
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:onClick="MyMethod"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:weightSum="1">
<TextView
android:id="@+id/letter"
android:onClick="MyMethod"
android:layout_width="60dp"
android:layout_height="fill_parent"
/>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:onClick="MyMethod"
android:layout_width="200dp"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/firstname"
android:onClick="MyMethod"
android:layout_width="fill_parent"
android:layout_height="17dp" />
<TextView
android:id="@+id/longname"
android:onClick="MyMethod"
android:layout_width="fill_parent"
android:layout_height="wrap_content" />
</LinearLayout>
<Button
android:text="Test"
android:onClick="OtherMethod"
android:layout_width="match_parent"
android:layout_height="fill_parent"
android:id="@+id/process"/>
</LinearLayout>
- Innen-Halter, die Sie tun können getAdapterPosition, um die Besondere position. Hier braucht kein
setTag()
undgetTag()
. - Ja, ich kann verwenden, dass innerhalb der adapter. Obwohl, was ich will, ist in der Lage sein, um die position in der MainActivity nicht in den adapter.
- Haben Sie Lesen Sie über einige der Antworten hier? stackoverflow.com/questions/24885223/...
- ja, es war eins der Themen, auf die ich gestoßen bin, während ich war auf der Suche nach einer Lösung für mein problem.
- bitte fügen Sie den adapter code hier
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies können Sie erreichen, indem eine Schnittstelle in Ihrem adapter für ein
itemclicklistener
und dann können SieonItemClickListener
von IhremMainActivity
.Irgendwo in Ihrem
RecyclerViewAdapter
müssen Sie die folgenden:Dann in Ihrem
ViewHolder
(die ich Hinzugefügt habe, als eine innere Klasse in meiner adapter), Sie gelten würde, die die Zuhörer auf die Komponenten, die Sie möchten, dass Benutzer auf die anzeigen klicken, etwa so:Dieses Beispiel zeigt eine
onClickListener
angewendet wird, um das Bild im inneren, einViewHolder
.Zur Implementierung dieses Codes, Sie würde
setOnItemClickListener
zu Netzteil im innerenMainActivity
wie oben gezeigt.BEARBEITEN
Weil die
View
ist immer an dieOnItemClickListener
können Sie einswitch
- Anweisung in den Hörer, um sicherzustellen, dass die richtige Logik wird durchgeführt, um die richtige Komponente. Alles was Sie tun müssen, ist nehmen Sie die Logik aus derMyMethod
- Funktion und das kopieren und einfügen, um die Komponente, die Sie wünschen angewendet werden.Beispiel:
Würden Sie auch brauchen, um etwas zu verändern, im inneren des
ViewHolder
. anstelle der Anwendung derOnClickListener
zu einemImageView
würden Sie anwenden müssen, um die ganze Zeile etwa so:EDIT 2
Erklärung:
So, mit jedem
RecyclerView
. Sie müssen drei Komponenten, DieRecyclerView
,RecyclerViewAdapter
und dieRecyclerViewHolder
. Diese sind das, was definieren die eigentlichen Komponenten, die der Nutzer sieht (RecyclerView
) und die Elemente innerhalb dieser Ansicht. Der Adapter ist, wo alles ist zusammengetragen und die Logik implementiert ist. Die ins und outs der diese Komponenten sind schön erklärt von Bill Phillips mit dem ArtikelRecyclerView
- Teil 1: Grundlagen Für dieListenansicht
Experten über auf der Big Nerd Ranch.Aber weiter zu erklären, die Logik hinter das click-Ereignis, es ist im Grunde die Verwendung einer Schnittstelle zum übergeben von Informationen von der
RecyclerViewAdapter
zu denRecyclerViewHolder
zu IhremMainActivity
. Also, wenn Sie Folgen Sie den Lebenszyklus derRecyclerView
adapter, es mache Sinn.Den adapter initialisiert in Ihrem
MainActivity
, den Konstruktor des Adapters würde dann aufgerufen werden, mit der Informationen weitergegeben werden. Die Bauteile würden dann weitergeleitet werden in den adapter über denOnCreateViewHolder
Methode. Dieser selbst erzählt, den adapter, das ist, wie Sie würden, wie die Liste Aussehen soll. Die Komponenten in diesem layout, dann würde müssen einzeln initialisiert, das ist, wo dieViewHolder
ins Spiel kommt. Wie Sie sehen können, wie alle anderen Komponenten würden Sie initialisieren IhreActivities
machen Sie das gleiche in derViewHolder
sondern weil dieRecyclerViewAdapter
bläst denViewHolder
können Sie gerne verwenden Sie in Ihrem adapter, wie gezeigt, von Zeeshan Shabbir. Aber in diesem Beispiel möchten Sie mehrere Komponenten haben unterschiedliche Logik, die jeder einzelnen in IhremMainActivity
Klasse.Das ist, wo wir anlegen, klicken Sie auf die Zuhörer wie eine Globale variable (also es kann zugegriffen werden, indem sowohl die
ViewHolder
und dieAdapter
) der adapter die Aufgabe in diesem Fall ist die Gewährleistung der Zuhörer vorhanden ist, indem eineInterface
können Sie initialisieren die Zuhörer durch.Nachdem Sie definiert haben, die Informationen, die Sie würde, wie die Schnittstelle zu halten (E. G. die Komponente und Ihre position), dann können Sie eine Funktion erstellen, in dem der adapter rufen Sie auf anwenden, um die Logik von Ihrem
Activity
(genauso, wie Sie genanntView.OnClickListener
), sondern durch die Schaffung einessetOnItemClickListener
, können Sie es anpassen.Diese Funktion muss dann
onRecyclerViewItemClickListener
variable übergeben, wie gesehen, in IhremMainActivity
.new RecyclerViewAdapter.onRecyclerViewItemClickListener()
in diesem Fall ist es die Schnittstelle, die Sie zuvor erstellt mit der Methode hinein, das würde umgesetzt werden müssen, damit diegenannt wird.
Alle
ViewHolder
hat in diesem Szenario geben die Informationen (die Komponenten, Die es selbst ist, und die position) in deronItemClickListener
mit den angeschlossenen Komponenten (innerhalb deronClick
- Funktion) schließen Sie die eigentliche click-Funktionalität.wenn Sie möchten, dass mich zur Aktualisierung der Erklärung wie auch immer, lassen Sie es mich wissen.
Ich denke, Sie stecken mit der Handhabung der mehrere Klicks auf
ReceylerView
wenn das der Fall ist, dann lassen Sie mich Ihnen ein code-snippet aus meinem Projekt. Das ist, wie ich mit dem klicken Sie inRecyclerView
können Sie festlegen, klicken Sie auf listener zu jedem Element in bindViewHolder() wie ich für
cardView
ich hoffe das wird einigen helfen.