2015-03-11 12 views
8

beim Aufruf notifyDataSetChanged auf RecyclerView es behält nicht die Scroll-Position und scrollt nach oben, gibt es eine Lösung, um seine Scroll-Position zu behalten?RecyclerView notifyDataSetChanged blättert zur obersten Position

+0

Sie eine Lösung gefunden? –

+1

** Rufen Sie nicht 'notifyDataSetChanged()' auf dem 'RecyclerView' auf. Benutze die neuen Methoden wie 'notifyItemChanged()', 'notifyItemRangeChanged()', 'notifyItemInserted()', etc ... –

+1

Ich habe notiereItemRangeInserted() versucht, aber selbst das scrollt nach oben. Irgendeine Idee? –

Antwort

3

Nicht sicher, ob dies Ihr Problem löst, aber ich hatte das gleiche Problem und es war, weil ich SetAdapter nach Benachrichtigung anrief. Also, nicht setAdapter nach Benachrichtigung aufrufen löste das Problem.

mAdapter.notifyItemRangeInserted(mAdapter.getItemCount(), list.size() - 1); 
recyclerView.setAdapter(); // remove this line. 
//Do this only when you're setting the data for the first time or when adapter is null. 
+0

Danke, es ist Arbeit –

8

Wenn Ihr RecyclerView Listenelement Elternteil hat „wrap_content“ Eigenschaft berechnet Recyclerview die Höhen wieder und blättert oben.

Es gibt zwei Lösungen:

  1. Geben Sie Ihre Größe ein konstanter Wert wie folgt aus: layout_height="100dp"
  2. Verwenden StaggeredGridLayoutManager wie folgt aus:

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

, wenn Sie wollen Ändern Sie Elemente mit Animationen, verwenden Sie die Methode notifyItemChanged in Fragm ent oder Aktivität. Nicht in Adapterklasse:

mRecyclerView.getAdapter().notifyItemChanged(position); 

Die zweite Lösung ist effizienter und ich schlage vor, diese ein

+0

Ja, Recycler-Ansicht berechnet die Höhe im Falle von "wrap_content", also fix setzt feste Layouthöhe oder Höhe auf "match_parent". – anp8850

1

RecycleViews auf jeder Variante von notifyDataSetChanged wieder nach oben bewegen, wenn sie nicht über einen Layout-Manager haben. Hier ist ein Beispiel, wie man eins setzt.

recycleView.setLayoutManager(new LinearLayoutManager(context, OrientationHelper.VERTICAL, false)); 
0

Wie ich bin zu raten, was Sie tun, ist der Adapter mit dem RecyclerView Zurücksetzen und dann ruft notifyDataSetChanged().

Sie müssen nur die dataList an den Adapter vorbei dataList in Adapter Verfahren wie Adapter vorbei update(dataList) . Und in dieser Methode können Sie diese Liste zu Adapterliste wie;

public void update(ArrayList<Hashmap<String,String> list){ 
    this.mList = list; 
} 
0

können Sie Position halten, indem sie vor notifyDataSetChanged speichern und dann glatt blättern, um gespeicherte Position rufen

final int currentVisibleItem = ((LinearLayoutManager) layourmanager).findFirstCompletelyVisibleItemPosition(); 
          productListAdapter.notifyDataSetChanged(); 
          Handler handler = new Handler(); 
          handler.postDelayed(new Runnable() { 
           @Override 
           public void run() { 

        if(currentVisibleItem>-1 && currentVisibleItem<lstProducts.size()) 
            rv_products.scrollToPosition(currentVisibleItem); 
           } 
          }, 100); 
Verwandte Themen