RecyclerView notifyDataSetChanged scrollt zur obersten Position

9

Beim Aufrufen von notifyDataSetChanged auf RecyclerView wird die Bildlaufposition nicht beibehalten und nach oben geblättert. Gibt es eine Lösung, um die Bildlaufposition beizubehalten?

    
Mohamed Hatem Abdu 11.03.2015, 17:40
quelle

6 Antworten

8

Wenn das übergeordnete RecyclerView-Listenelement die Eigenschaft "wrap_content" aufweist, berechnet Recyclerview die Höhen erneut und scrollt nach oben.

Es gibt zwei Lösungen:

  1. Legen Sie für Ihre Höhe einen konstanten Wert fest: layout_height="100dp"
  2. Verwenden Sie StaggeredGridLayoutManager wie folgt:

    mRecyclerView.setLayoutManager(new StaggeredGridLayoutManager(1, StaggeredGridLayoutManager.VERTICAL));

Wenn Sie Elemente mit Animationen ändern möchten, verwenden Sie die notifyItemChanged-Methode in Fragment oder Aktivität. Nicht in der Adapterklasse:

%Vor%

Die zweite Lösung ist effizienter und ich empfehle diese

    
serefakyuz 29.05.2016 13:22
quelle
3

Ich bin mir nicht sicher, ob das dein Problem löst, aber ich hatte das gleiche Problem und es war, weil ich setAdapter nach dem Notify aufgerufen habe. Also, nicht setAdapter nach der Benachrichtigung aufrufen löste das Problem.

%Vor%     
user3354265 08.02.2016 09:14
quelle
1

RecycleViews wird bei jeder Variante von notifyDataSetChanged zurück zum Anfang blättern, wenn sie keinen Layout-Manager haben. Hier ist ein Beispiel, wie man eins setzt.

%Vor%     
Maxwell 20.05.2017 05:07
quelle
0

Wie ich vermute, setzen Sie den Adapter auf RecyclerView zurück und rufen dann notifyDataSetChanged().

auf

Sie müssen nur den dataList an den Adapter übergeben, indem Sie in der Adaptermethode dataList wie den Adapter update(dataList) übergeben. Und bei dieser Methode können Sie diese Liste einer Adapterliste zuweisen wie:

%Vor%     
Sandy 16.07.2017 13:14
quelle
0

Sie können die Position beibehalten, indem Sie sie vor notifyDataSetChanged speichern und anschließend die Funktion "smooth scroll to saved position"

aufrufen %Vor%     
Rajesh Nasit 14.09.2017 05:07
quelle
-2

Sie können swapAdapter () und nach dem Aufruf notifyDataSetChange () . Das funktioniert für mich.

    
Cagdas Caglak 20.11.2015 13:39
quelle