Как получить 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;
}
});
Ответы
Ответ 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'