RecyclerView ambiguos setVisibility-Funktion, das Klicken auf eine Ansicht wirkt sich auf mehrere Ansichten aus

8

Das ist das Projekt , das ich versuchen möchte. Hier ist mein Code für den onBindViewHolder von RecyclerView.Adapter-Klasse

%Vor%

Die Liste wird geladen, das Problem tritt auf, wenn der onclicklistener von imageView aufgerufen wird.

%Vor%

Die obige Zeile ändert das Listenelement, auf das geklickt wurde. aber

%Vor%

Wenn diese Zeile ausgeführt wird, spiegelt sich die Änderung in mehreren Elementen in der Liste wider. Was läuft falsch? In den unten gezeigten Bildern habe ich auf Punkt 0 geklickt, der Text ändert sich auf "geklickt" und die Farbe wird gesetzt. Aber wenn ich nach unten scrolle, ist auch Punkt 12 von meinem Klick auf Punkt 0 betroffen. Nur die Hintergrundfarbe hat sich geändert, nicht die Textänderung. Wie höre ich damit auf?

Ich habe versucht, das für eine lange Zeit zu lösen, bitte laden Sie das Projekt herunter und versuchen Sie, den Code auszuführen, um zu verstehen, was ich genau meine, wenn meine Frage nicht klar ist.

    
55597 01.06.2015, 22:08
quelle

5 Antworten

11

Dies geschieht, weil die Ansichten wiederverwendet und wiederverwendet werden.

Wenn die Ansicht wiederverwendet wird, behält sie die Eigenschaften der "alten" Ansicht bei, wenn Sie sie nicht erneut ändern. Wenn Sie also bis zu Nummer 12 scrollen, wird die Ansicht, in der die Nummer 1 enthalten war, wieder verwendet (da sie nicht mehr auf dem Bildschirm zu sehen ist) und zur Erstellung der Nummer 12 verwendet. Deshalb ist die blaue Farbe auf der Zahl 12.

Wenn das Element zum Beispiel angeklickt wird, müssen Sie einen "angeklickten" Wert in Ihrem POJO-Objekt speichern. Dann, wenn das Objekt gezeichnet wird, überprüfen Sie diesen Wert und stellen Sie die richtige Bild- / Hintergrundfarbe in Abhängigkeit von diesem Wert ein.

Ich habe das im folgenden Code getan, also sollte es Ihnen eine ungefähre Vorstellung davon geben, was zu tun ist:

%Vor%

Und ich habe der MyPojo-Klasse einen "angeklickten" booleschen Wert hinzugefügt.

%Vor%     
Moonbloom 01.06.2015, 22:54
quelle
6

Fügen Sie einfach eine Methode in Ihrer Adapterklasse nach der Methode getItemCount

hinzu %Vor%

es wird das Problem lösen

    
DalveerSinghDaiya 05.01.2017 04:44
quelle
2

Es scheint, dass Sie bei der Verwendung von RecyclerView durch Aufruf von findViewById in onBindViewHolder verwirrt sind. Diese kostspieligen Nachschlagevorgänge sollten in onCreateViewHolder stattfinden, wo Sie alle Ansichten nachschlagen und ihre Verweise auf Ihren benutzerdefinierten Ansichtshalter speichern. Ich ging voraus, schaute auf Ihren Code in github Repo und schlagen die folgenden Änderungen vor:

%Vor%

Dies sollte der Ausgangspunkt für Ihr Debugging sein, da die Einhaltung dieses Musters ein ordnungsgemäßes Recycling garantiert.

Wie es auch in einer anderen Antwort erwähnt wird, müssen Sie sich den Klickzustand für jedes Element merken, und diesen Zustand im MyPojo-Objekt oder an einem anderen Ort zu halten, sollte relativ einfach sein.

    
dkarmazi 01.06.2015 22:56
quelle
0

Ich hatte ein ähnliches Problem (hatte eine Änderung der Nummer bei mehreren Listenelementen statt nur einer). Ich nehme an, dass es wegen der Funktionsweise einer Recycling-Ansicht funktioniert, und ich konnte es beheben, indem ich alles, was ich plane, auf den Standard ändere, den ich möchte.

IE: Wenn Sie den Hintergrund in blau ändern möchten, legen Sie beim Laden der Liste diejenigen, die nicht blau sein sollten, auf grau (oder was auch immer der Standard sein soll).

also hier:

%Vor%

Sie möchten die Standardwerte angeben

    
Epicblood 01.06.2015 22:16
quelle
-1

hier versuchen, diesen Adapter zu verwenden:

%Vor%

}

    
lord napster 01.06.2015 22:20
quelle