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;
}
});
実際には存在しないため、取得できません。 LayoutManager
は画面上のビューのみを知っており、以前のビュー、サイズなどを知りません。
スクロールリスナーを使用してカウントできる数は信頼できません。データが変更された場合、RecyclerView
は新しいレイアウト計算を行い、実際のオフセットの再計算を試行しないためです(onScroll(0, 0)
ビューが移動した場合)。
RecyclerViewはスクロールバーのこの値を推定します。View
クラスの同じメソッドを使用できます。
computeHorizontalScrollExtent
computeHorizontalScrollRange
computeHorizontalScrollOffset
これらのメソッドには、垂直に対応するものもあります。
私は、現在スクロールされているアイテム位置インデックスを取得したいだけの質問に来ました。同じことをしたい他の人のために、あなたは以下を使うことができます:
_LinearLayoutManager myLayoutManager = myRecyclerView.getLayoutManager();
int scrollPosition = myLayoutManager.findFirstVisibleItemPosition();
_
これらの他のポジションを取得することもできます:
findLastVisibleItemPosition()
findFirstCompletelyVisibleItemPosition()
findLastCompletelyVisibleItemPosition()
この回答 に感謝します。また、スクロール位置を保存および復元する方法も示します。
Suragch solution ...へのクレジットでRecyclerView
内の最後のスクロール位置を取得するための回避策を見つけました...グローバルにアクセス可能な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);
Populate Adapterメソッドで
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);
}
recyclerView.computeVerticalScrollOffset()
はトリックを行います。
scrollDy
を読む必要があります
public void onScrollStateChanged(RecyclerView recyclerView, int newState)
その後、recyclerView'
sスクロール位置