web-dev-qa-db-ja.com

Recyclerview / LayoutmanagerでScrollpositionを取得する方法は?

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

実際には存在しないため、取得できません。 LayoutManagerは画面上のビューのみを知っており、以前のビュー、サイズなどを知りません。

スクロールリスナーを使用してカウントできる数は信頼できません。データが変更された場合、RecyclerViewは新しいレイアウト計算を行い、実際のオフセットの再計算を試行しないためです(onScroll(0, 0)ビューが移動した場合)。

RecyclerViewはスクロールバーのこの値を推定します。Viewクラスの同じメソッドを使用できます。

computeHorizontalScrollExtent

computeHorizontalScrollRange

computeHorizontalScrollOffset

これらのメソッドには、垂直に対応するものもあります。

40
yigit

私は、現在スクロールされているアイテム位置インデックスを取得したいだけの質問に来ました。同じことをしたい他の人のために、あなたは以下を使うことができます:

_LinearLayoutManager myLayoutManager = myRecyclerView.getLayoutManager();
int scrollPosition = myLayoutManager.findFirstVisibleItemPosition();
_

これらの他のポジションを取得することもできます:

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

この回答 に感謝します。また、スクロール位置を保存および復元する方法も示します。

17
Suragch

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);
}
1
Von Neumann

recyclerView.computeVerticalScrollOffset()はトリックを行います。

1
AndroidDev

scrollDyを読む必要があります

public void onScrollStateChanged(RecyclerView recyclerView, int newState)

その後、recyclerView'sスクロール位置

0
paju_man