2015-04-11 17 views
14

Wie erhalten Sie die Scrollposition in Recyclerview oder die Layoutmanager?Wie bekomme ich die Scrollposition im Recyclerview/Layoutmanager?

kann ich die scroll messen, indem ein OnScrollListener Zugabe, aber wenn die Ausrichtung scrollDy ändert, ist 0.

mRecyclerView.setOnScrollListener(new RecyclerView.OnScrollListener() { 
      int scrollDy = 0; 
      @Override 
      public void onScrollStateChanged(RecyclerView recyclerView, int newState) { 
       super.onScrollStateChanged(recyclerView, newState); 
      } 

      @Override 
      public void onScrolled(RecyclerView recyclerView, int dx, int dy) { 
       scrollDy += dy; 
      } 
     }); 
+3

Können Sie die Qualität Ihrer Frage ein wenig verbessern? Ihre Antwort sieht gut aus, aber die Frage muss klarstellen, dass das Problem besser gelöst ist. –

+0

Diese https://stackoverflow.com/questions/36568168/how-to-save-scroll-position-of-recyclerview-in-android/36569778#3656977 ist die richtige Antwort. Schau mal, es hat für mich funktioniert. –

Antwort

32

Sie können es nicht, weil es existiert nicht wirklich. LayoutManager kennt nur die Ansichten auf dem Bildschirm, es kennt nicht die Ansichten vor, was ihre Größe usw.

Die Nummer, die Sie mit dem Scroll-Listener zählen können, ist nicht zuverlässig, denn wenn sich die Daten ändern, wird RecyclerView ein neues Layout tun Berechnung und wird nicht versuchen, einen realen Offset neu zu berechnen (Sie erhalten eine onScroll(0, 0), wenn Ansichten verschoben werden).

RecyclerView Schätzungen dieser Wert für Bildlaufleisten können Sie die gleichen Methoden aus View Klasse.

computeHorizontalScrollExtent

computeHorizontalScrollRange

computeHorizontalScrollOffset

Diese Methoden haben ihre als auch vertikale Pendants.

+1

Hallo Yigit wieder :) Ich bin der Kartenmann, der dir das letzte Mal mailte. Also möchte ich Ansichten wie folgt über den Bildschirm bewegen: https://github.com/ksoichiro/Android-ObservableScrollView/blob/master/samples/images/demo12.gif Ich kann es tun, indem ich die obige Methode benutze . Aber nach einer Orientierungsänderung ist dieses Feld 0. Wie könnte eine zuverlässige Lösung aussehen? Weil Ihre Antwort darauf hindeutet, dass das Speichern der Scrollposition in einem gespeicherten Zustand die Dinge nicht besser machen würde, stimmt das? – seb

+0

Ich denke, deine beste Option ist es, deine Scroll-Position nach einer Drehung wiederherzustellen. Sie können die erste sichtbare Position erhalten und daraus abhängig Ihre Scroll-Position berechnen. Sie können auch untergeordnete Elemente des Layout-Managers durchlaufen. LLM garantiert, dass die Reihenfolge der untergeordneten Positionen mit der Reihenfolge der Adapter übereinstimmt. Dies ist keine API-Garantie, aber es ist sehr unwahrscheinlich, dass sich dies ändert. – yigit

+0

Es scheint, als ob alle diese Methoden 0, die Standardimplementierung, zurückgeben. Es wird erwartet, dass Sie diese Methode im Layout-Manager implementieren. –

0

Sie haben scrollDy in

public void onScrollStateChanged(RecyclerView recyclerView, int newState) 

dann lesen Sie recyclerView' s Scroll-Position bekommen

+0

Dies wird oft nicht ausgelöst, wenn die Liste nach dem Hinzufügen/Entfernen von Elementen scrollt – martyglaubitz

2

ich auf die Frage kam nur das Element Positionsindex wollen bekommen, die derzeit gescrollt. Für andere, die das gleiche tun wollen, können Sie Folgendes verwenden:

LinearLayoutManager myLayoutManager = myRecyclerView.getLayoutManager(); 
int scrollPosition = myLayoutManager.findFirstVisibleItemPosition(); 

Sie können auch diese anderen Positionen erhalten:

  • findLastVisibleItemPosition()
  • findFirstCompletelyVisibleItemPosition()
  • findLastCompletelyVisibleItemPosition()

Danke an this answer für Hilfe mit diesem. Es zeigt auch, wie die Bildlaufposition gespeichert und wiederhergestellt wird.

4

Für die zukünftige Verwendung, wenn Sie zwischen Fragments innerhalb derselben activity wechseln und alles, was Sie tun möchten, ist speichern Scroll-Position für recyclerview und dann wiederherstellen recyclerview auf die gleiche Scroll-Position, können Sie tun, wie folgt:

In Ihrem onStop()/onDestroyView()/onPause() was Rückruf ist besser geeignet, dies zu tun:

Parcelable recylerViewState = recyclerView.getLayoutManager().onSaveInstanceState(); 

und in Ihrer onStart()/onCreateView()/onResume(), was Rückruf ist besser geeignet, dies zu tun:

recyclerView.getLayoutManager().onRestoreInstanceState(recylerViewState); 

Auf diese Weise können Sie erfolgreich Ihren recyclerView's Zustand in einem parcelable halten und wiederherstellen, wann immer Sie wollen.

Verwandte Themen