繁体   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