Mein Problem ist, wenn Recycler View nach oben und unten scrollt
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%}
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%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?
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
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.
Überschreiben Sie diese beiden Methoden in Ihrem Recyclerview-Adapter und ändern Sie den Code von getItemViewType
wie folgt.
Ich hatte auch das gleiche Problem. Mach das. Dies wird definitiv Ihr Problem lösen.
Tags und Links android android-recyclerview fragment adapter android-viewholder