Подтвердить что ты не робот

Как получить Scrollposition в Recyclerview/Layoutmanager?

Как получить прокрутку в Recyclerview или Layoutmanager?

Я могу измерить прокрутку, добавив OnScrollListener, но когда меняется ориентация 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;
            }
        });
4b9b3361

Ответ 1

Вы не можете получить его, потому что он действительно не существует. LayoutManager знает только о представлениях на экране, он не знает представления раньше, каков их размер и т.д.

Число, которое вы можете подсчитать, используя прослушиватель прокрутки, не является надежным, поскольку, если данные изменяются, RecyclerView выполнит новый расчет макета и не будет пытаться пересчитать реальное смещение (вы получите onScroll(0, 0) if просмотренные просмотры).

RecyclerView оценивает это значение для полос прокрутки, вы можете использовать те же методы из класса View.

computeHorizontalScrollExtent

computeHorizontalScrollRange

computeHorizontalScrollOffset

Эти методы также имеют свои вертикальные копии.

Ответ 2

Для будущего использования Если вы переключаетесь между Fragments внутри одного и того же activity, и все, что вы хотите сделать, это сохранить положение прокрутки для recyclerview, а затем восстановить recyclerview в ту же позицию прокрутки, вы можете сделать следующее:

В вашем onStop()/onDestroyView()/onPause() любой обратный вызов более подходит, выполните следующее:

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

И в вашем onStart()/onCreateView()/onResume() любой обратный вызов будет более уместным, сделайте следующее:

recyclerView.getLayoutManager().onRestoreInstanceState(recylerViewState);

Таким образом вы можете успешно сохранить состояние recyclerView's в parcelable и восстановить его, когда захотите.

Ответ 3

Я пришел к вопросу, просто желая получить индекс позиции позиции, который в настоящее время прокручивается. Для тех, кто хочет сделать то же самое, вы можете использовать следующее:

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

Вы также можете получить следующие позиции:

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

Спасибо этот ответ за помощью. Он также показывает, как сохранить и восстановить положение прокрутки.

Ответ 4

Нашли работу вокруг, чтобы получить последний прокручиваться позиции в RecyclerView с кредитами на решение Suragch... Объявите глобально доступный LinearLayoutManager так, чтобы иметь возможность доступа к нему во внутренних методов... Когда когда - либо populateChatAdapter метод называется, если его первый вызов прокрутки до позиции будет последним отправленным сообщением, и если пользователь прокрутил, чтобы просмотреть предыдущие сообщения, и метод был вызван снова, чтобы обновить новые сообщения, то они сохранят свою последнюю прокрутку до позиции...

LinearLayoutManager linearLayoutManager;
int lastScrollPosition = 0;
RecyclerView messages_recycler;

Инициировать их...

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

На вашем методе заполнить адаптер

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);
}

Ответ 5

recyclerView.computeVerticalScrollOffset() делает свое дело.

Ответ 6

Вы должны прочитать scrollDy в

public void onScrollStateChanged(RecyclerView recyclerView, int newState)

то вы можете получить recyclerView' положение прокрутки

Ответ 7

asdl Qee ASDFJLKDF flKASLD ASJDI3WEIQJWED AD асдасд асдлал а; дасд ада asdl; sa kfsdf s sdfsdf

sadfsd asdf asdfsdf'sdfsdf asdasdasd'