簡體   English   中英

如何在 Recyclerview/Layoutmanager 中獲取 Scrollposition?

[英]How to get the Scrollposition in the Recyclerview/Layoutmanager?

如何在Recyclerview或 Layoutmanager 中獲取滾動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)您將收到onScroll(0, 0) )。

RecyclerView 估計滾動條的這個值,您可以使用View類中的相同方法。

computeHorizontalScrollExtent

computeHorizontalScrollRange

computeHorizontalScrollOffset

這些方法也有它們的垂直對應物。

為了將來使用,如果您在同一activity Fragments之間切換,並且您想要做的只是為recyclerview保存 scroll-position ,然后recyclerview恢復到相同的 scroll-position ,則可以執行以下操作:

在您的onStop()/onDestroyView()/onPause()無論回調是否更合適,請執行以下操作:

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

在你的onStart()/onCreateView()/onResume()無論回調是否更合適,請執行以下操作:

recyclerView.getLayoutManager().onRestoreInstanceState(recylerViewState);

通過這種方式,您可以成功地將recyclerView's狀態保持在可parcelable狀態,並在需要時parcelable恢復。

我來到這個問題只是想獲取當前滾動到的項目位置索引。 對於其他想要這樣做的人,您可以使用以下方法:

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

您還可以獲得這些其他職位:

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

感謝這個答案對此的幫助。 它還展示了如何保存和恢復滾動位置。

recyclerView.computeVerticalScrollOffset()可以解決問題。

找到了一個解決方法來獲得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);
}

你必須閱讀scrollDy

public void onScrollStateChanged(RecyclerView recyclerView, int newState)

然后你可以得到recyclerView'的滾動位置

要獲得 ScroolPosition 試試這個:

  1. 你會需要這個:

     mLayoutManager = new LinearLayoutManager(getApplicationContext(), LinearLayoutManager.HORIZONTAL, false);
  2. 然后獲取mLayoutManager的位置(像這樣):

 recyclerView .addOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) { super.onScrollStateChanged(recyclerView, newState); int pos = mLayoutManager.getPosition(v); RecyclerView.ViewHolder viewHolder = recyclerView.findViewHolderForAdapterPosition(pos); } });

有了這個“pos”,你就得到了位置,從 0 開始。

   int pos = mLayoutManager.getPosition(v);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM