Wie ruft man eine MainActivity-Methode von ViewHolder in RecyclerView.Adapter auf?

8

In einem einfachen App-Projekt bei GitHub habe ich nur zwei benutzerdefinierte Java-Dateien:

  1. MainActivity.java enthält Bluetooth- und UI-bezogenen Quellcode
  2. DeviceListAdapter.java enthält Adapter und ViewHolder für die Anzeige von Bluetooth-Geräten in RecyclerView

Die MainActivity. Java enthält eine Methode, die aufgerufen wird, wenn ein Benutzer auf ein Bluetooth-Gerät in RecyclerView :

tippt %Vor%

Und in der Klasse ViewHolder (in der DeviceListAdapter.java ) der Klick-Listener ist definiert:

%Vor%

Mein Problem:

So rufen Sie confirmConnection(address) method von ViewHolder s onClick method?

auf

Ich bewege ViewHolder -Klassen-Deklaration zwischen den 2 Java-Dateien und versuche auch, es in eine eigene Datei zu legen - und finde einfach nicht den richtigen Weg.

Soll ich der ViewHolder -Klasse ein Feld hinzufügen und (wenn?) einen Verweis auf MainActivity instance speichern?

UPDATE:

Dies funktioniert bei mir, scheint aber ein Workaround zu sein (und ich dachte auch daran, LocalBroadcastReceiver zu verwenden - was eine noch hackere Umgehung wäre) -

%Vor%     
Alexander Farber 22.09.2015, 15:17
quelle

5 Antworten

18

Um Ihre Klassen voneinander zu entkoppeln, würde ich vorschlagen, eine Schnittstelle auf Ihrem Adapter zu definieren, etwa:

%Vor%

Fügen Sie dann in Ihrem Adapter einen Setter hinzu:

%Vor%

Dann intern, in Ihrem ViewHolder onClick() :

%Vor%

Dann lassen Sie Ihre MainActivity in einem Listener an die Adapter übergeben:

%Vor%

Auf diese Weise können Sie den Adapter später wiederverwenden, ohne dass er an dieses spezielle Verhalten gebunden ist.

    
kcoppock 22.09.2015, 15:24
quelle
3

Für diejenigen, die einen Callback von einem statischen ViewHolder aufrufen möchten, gehen Sie folgendermaßen vor. Lass dir einen Adapter:

%Vor%

Dann sollten Sie eine setCallback-Methode hinzufügen und sie aus Aktivität / Fragment aufrufen. Außerdem sollten Sie einen statischen Callback nicht durchführen (dies kann zu Problemen führen, wenn Sie in vielen Klassen denselben Adapter verwenden). Sie sollten ein Feld innerhalb des ViewHolders erstellen. Also:

%Vor%

Nachdem Sie den Adapter erstellt haben, können Sie ihn wie folgt aufrufen:

%Vor%     
CoolMind 12.11.2016 14:00
quelle
1

Sie könnten MainActivity als Konstruktorparameter für den Adapter übergeben und in einem Feld speichern. Oder Sie verwenden einen Event-Bus - es gibt mehrere Möglichkeiten, dies zu tun - ich würde für das Feld

gehen     
ligi 22.09.2015 15:21
quelle
1

Sie können die Activity-Methode aufrufen, indem Sie eine Instanz der Aktivität wie folgt verwenden, innerhalb von MainActivity schreiben Sie unter Code

%Vor%

Innenadapter

%Vor%

Innerhalb Ihrer onClick-Methode

%Vor%     
Ajit Kumar Dubey 22.09.2015 15:33
quelle
1

Erstellen Sie in Ihrem Adapter eine Schnittstelle, die einen Rückruf für die Hauptaktivität bereitstellt

%Vor%

haben Sie Ihre Haupttätigkeit, es zu implementieren

%Vor%

dann implementieren Sie den Rückruf

%Vor%

dann einfach den Rückruf vom Adapter

%Vor%     
tyczj 22.09.2015 15:25
quelle