wake-up-neo.com

Wie erhalte ich die Scrollposition im Recyclerview/Layoutmanager?

Wie bekomme ich die Scrollposition in Recyclerview oder Layoutmanager?

Ich kann die Scrollposition durch Hinzufügen einer OnScrollListener messen, aber wenn sich die Ausrichtung ändert, ist scrollDy 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;
            }
        });
18
seb

Sie können es nicht bekommen, weil es nicht wirklich existiert. LayoutManager kennt nur die Ansichten auf dem Bildschirm, sie kennt die Ansichten vorher nicht, wie groß sie sind usw.

Die Anzahl, die Sie mithilfe des Bildlauflisteners zählen können, ist nicht zuverlässig, da RecyclerView bei Änderungen der Daten eine neue Layoutberechnung durchführt und nicht versucht, einen realen Versatz neu zu berechnen (Sie erhalten eine onScroll(0, 0), wenn Ansichten verschoben werden).

RecyclerView schätzt diesen Wert für Bildlaufleisten. Sie können dieselben Methoden aus der Klasse View verwenden.

computeHorizontalScrollExtent

computeHorizontalScrollRange

computeHorizontalScrollOffset

Diese Methoden haben auch ihre vertikalen Gegenstücke.

34
yigit

Ich bin auf die Frage gekommen, nur um den Positionsindex des Elements zu erhalten, zu dem gerade gescrollt wird. Für andere, die dasselbe tun möchten, können Sie Folgendes verwenden:

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

Sie können auch diese anderen Positionen erhalten:

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

Vielen Dank an diese Antwort für die Hilfe. Es wird auch gezeigt, wie die Bildlaufposition gespeichert und wiederhergestellt wird.

17
Suragch

Für die zukünftige Verwendung: Wenn Sie zwischen Fragments innerhalb derselben activity umschalten und alles, was Sie tun möchten, ist Bildlaufposition speichern für recyclerview und dann stellen Sie recyclerview an derselben Bildlaufposition wieder her - /, können Sie dies tun folgt:

Führen Sie in Ihrer onStop()/onDestroyView()/onPause(), was auch immer der passendere Rückruf ist, Folgendes aus:

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

Und in Ihrer onStart()/onCreateView()/onResume(), was auch immer der Rückruf angemessener ist, tun Sie dies:

recyclerView.getLayoutManager().onRestoreInstanceState(recylerViewState);

Auf diese Weise können Sie Ihren recyclerView's-Status erfolgreich in einer parcelable beibehalten und jederzeit wiederherstellen.

14
Shoaib Anwar

recyclerView.computeVerticalScrollOffset() macht den Trick.

1
AndroidDev

Es wurde eine Arbeit gefunden, um die letzte gescrollte Position innerhalb der RecyclerView mit Credits an Suragch solution ....__ zu erhalten. Deklarieren Sie eine global zugreifbare LinearLayoutManager, damit Sie innerhalb innerer Methoden darauf zugreifen können ....__ Wenn die Methode populateChatAdapter aufgerufen wird, wird beim Scrollen an Position zuerst die zuletzt gesendete Nachricht aufgerufen. Wenn der Benutzer zur Anzeige vorheriger Nachrichten gescrollt hat und die Methode erneut aufgerufen wird, um neue Nachrichten zu aktualisieren, bleibt der letzte Scroll an Position erhalten ...

LinearLayoutManager linearLayoutManager;
int lastScrollPosition = 0;
RecyclerView messages_recycler;

Initiiere sie ...

messages_recycler = findViewById(R.id.messages_recycler);
linearLayoutManager = new LinearLayoutManager(this);
linearLayoutManager.setStackFromEnd(true);
messages_recycler.setLayoutManager(linearLayoutManager);

Auf Ihrer Populate-Adapter-Methode

private void populateChatAdapter(ObservableList<ChatMessages> msgs) {

    if (lastScrollPosition==0) lastScrollPosition = msgs.size()-1;
    ChatMessagesRecycler adapter = new ChatMessagesRecycler(msgs);
    messages_recycler.setAdapter(adapter);
    messages_recycler.addOnScrollListener(new RecyclerView.OnScrollListener() {
        @Override
        public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
            super.onScrolled(recyclerView, dx, dy);
            lastScrollPosition = linearLayoutManager.findLastCompletelyVisibleItemPosition();
        }
    });
    messages_recycler.scrollToPosition(lastScrollPosition);
}
0
Von Neumann

Sie müssen scrollDy in lesen 

public void onScrollStateChanged(RecyclerView recyclerView, int newState)

dann können Sie recyclerView's Scrollposition erhalten

0
paju_man