Die RecyclerView-Zeile wird gemischt und ändert Bilder: android

8
  • Änderungen in der Frage, da das andere Problem behoben wurde.

Mein Problem ist, wenn Recycler View nach oben und unten scrollt

  • Zeilenelement ändert seine Position, wenn es schnell scrollt und zur ursprünglichen Position zurückkehrt.
  • Zeilenelement bewirkt, dass ein Teil als Hintergrund repariert wird

Hier stelle ich meine Recycler-Ansicht in Fragment dar.

%Vor%

Hier ist meine Adapterklasse

In meinem Adapter setze ich eine Kopfzeile

// Meine ViewHolder

%Vor%

// Deklaration von Variablen

%Vor%

// Konstruktor

%Vor%

// Einstellung der Datenliste

%Vor%

// onCreateViewHolder

%Vor%

// onBindViewHolder ich bin meine Ansicht mit Daten binden.

%Vor%

// Zeilenbild setzen.

%Vor%

// Bedingung zum Setzen von Kopfzeile und Zeile anzeigen.

%Vor%

}

    
abhishek 07.11.2015, 05:39
quelle

4 Antworten

3

Ich habe einen sehr ähnlichen Adapter in meiner App, wo ich Feeds von Facebook statt von Twitter anzeigen lasse. Zunächst einmal zu Glide statt zu Picasso wechseln, da es mit RecyclerView ein besseres Caching und Laden von Bildern ermöglicht, check THIS . Wenn Sie nun zu Ihrem Problem kommen, rufen Sie setHasStableIds (true) auf Ihrem Adapter im ersten Schritt auf, überschreiben Sie die getItemId-Methode, um eine passende long von Ihrem Adapter zurückzugeben, da Sie einen Feed verwenden, können Sie einen Hash-Wert für die postId oder berechnen Ein eindeutiges Feld identifiziert jeden Beitrag innerhalb eines Feeds. Mein Feed hat auch ein optionales Bild, weshalb ich diese 2 Methoden habe %Vor%

und dann müssen Sie nur diese Methoden von Ihrem onBindViewHolder aufrufen, um das Bild zu setzen. Post ist mein Objekt, das die Details eines einzelnen Posts wie Name, Benutzer-ID, Bild-URL für das Bild der Person und Bild-URL für das Post-Bild enthält, das optional ist. Lassen Sie mich wissen, wenn Sie weitere Probleme auftreten.

%Vor%     
PirateApp 08.11.2015 04:48
quelle
2

Wenn Sie den Quellcode von RecyclerView über HIER navigieren Sie zu Zeile 3028, die diese Zeilen enthält

%Vor%

und Zeile 5279 in der Quelldatei, die dieses enthält

%Vor%

zeigt deutlich an, dass überschreibende setHasStableIds von der überschreiben Methode getItemId gefolgt werden muss. Um jedes Element in Ihrem RecyclerView anzuzeigen, zeigen Sie das richtige Element an, wenn Sie nach oben und unten scrollen. GetItemId kann keine Position zurückgeben oder wird noch schlimmer angezeigt. Stellen Sie sicher, dass Sie einen eindeutigen langen Wert zurückgeben, der jede Zeile in Ihrem Datensatz identifiziert.

Was könnte dieser einzigartige Wert sein?

  1. Ein eindeutiger Zeitstempel, wann Ihr Twitter-Beitrag erstellt wurde, wenn Sie ihn haben?
  2. Ein berechneter eindeutiger langer Wert wie Hash für ein oder mehrere Elemente aus Ihrem Datensatz, der einen eindeutigen Wert ergeben würde.

Dies ist sowohl für Animationen als auch für das Anzeigen der richtigen Zeile an der richtigen Position wichtig. Hoffe, dass hilft dein Problem zu beheben

    
PirateApp 26.11.2015 05:06
quelle
1

Das Problem besteht darin, dass Sie getItemID nicht implementieren oder es nicht ordnungsgemäß implementieren.

Wenn Sie setHasStableIds auf "true" setzen und Sie nicht "getItemId" implementieren, um ein eindeutiges long für jedes Element in der Liste zurückzugeben, wird die RecyclerView Elemente duplizieren. Dies liegt daran, dass die Standardimplementierung von getItemID -1 für alle Elemente in der Liste zurückgibt. Wenn onBindViewHolder aufgerufen wird, nachdem eine Ansicht wiederverwendet wurde, wird daher eine zwischengespeicherte Ansicht der letzten Anzeige von ViewHolder zurückgegeben.

Eine einfache Möglichkeit, dies zu implementieren, besteht darin, nur den Hashcode für das Objekt in der Liste zurückzugeben, die an diesen ViewHolder gebunden ist.

%Vor%

Offensichtlich bedeutet dies, dass für dieses spezielle Objekt die Methoden equals() und hashCode() überschrieben werden müssen, um für jedes Objekt eindeutig zu sein. Eine gute Idee ist ein String , das anzeigt, wann es erstellt wurde, wenn es aus einer Datenbank stammt, die mit dem Objektnamen verkettet ist.

    
Tunji_D 25.11.2015 15:50
quelle
0

Überschreiben Sie diese beiden Methoden in Ihrem Recyclerview-Adapter und ändern Sie den Code von getItemViewType wie folgt.

%Vor%

Ich hatte auch das gleiche Problem. Mach das. Dies wird definitiv Ihr Problem lösen.

    
Fathima km 30.11.2017 04:56
quelle