[英]How to access LayoutManager from RecyclerView.Adapter to get scrollToPosition?
[英]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 試試這個:
你會需要這個:
mLayoutManager = new LinearLayoutManager(getApplicationContext(), LinearLayoutManager.HORIZONTAL, false);
然后獲取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.