android 如何在回收站视图/布局管理器中获得滚动位置?

zwghvu4y  于 2023-01-24  发布在  Android
关注(0)|答案(7)|浏览(225)

如何获取RecyclerviewLayoutmanager中的滚动位置?
我可以通过添加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;
            }
        });
ssgvzors

ssgvzors1#

为便于将来使用,如果您要在同一activity中的Fragments之间切换,并且您要做的只是保存recyclerview的滚动位置,然后recyclerview恢复到同一滚动位置,则可以执行以下操作:
在您的onStop()/onDestroyView()/onPause()中,无论哪个回调更合适,请执行以下操作:

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

在你的onStart()/onCreateView()/onResume()中,无论哪个回调更合适,都可以这样做:

recyclerView.getLayoutManager().onRestoreInstanceState(recylerViewState);

这样,您就可以成功地将recyclerView's状态保留在parcelable中,并在需要时恢复它。

yshpjwxd

yshpjwxd2#

你不能得到它,因为它并不存在。LayoutManager只知道屏幕上的视图,它不知道以前的视图,它们的大小等。
使用scroll侦听器计算的数字并不可靠,因为如果数据发生变化,RecyclerView将重新进行布局计算,而不会尝试重新计算真实的偏移量(如果视图发生移动,您将收到onScroll(0, 0))。
RecyclerView估计滚动条的此值,您可以使用View类中的相同方法。
computeHorizontalScrollExtent
computeHorizontalScrollRange
computeHorizontalScrollOffset
这些方法也有它们的垂直对应物。

js4nwp54

js4nwp543#

我来到这个问题只是想得到当前滚动到的项目位置索引。对于其他想做同样事情的人,你可以使用以下代码:

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

你也可以得到这些其他职位:

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

感谢this answer的帮助,它还展示了如何保存和恢复滚动位置。

gdx19jrr

gdx19jrr4#

recyclerView.computeVerticalScrollOffset()就可以了。

t40tm48m

t40tm48m5#

找到了一种变通方法,可以获取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);
}
cu6pst1q

cu6pst1q6#

必须将scrollDy读入

public void onScrollStateChanged(RecyclerView recyclerView, int newState)

那么你可以得到recyclerView'的滚动位置

0yycz8jy

0yycz8jy7#

要获取ScroolPosition,请尝试以下操作:
1.您将需要这个:

mLayoutManager = new LinearLayoutManager(getApplicationContext(), LinearLayoutManager.HORIZONTAL, false);

1.然后获取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);

相关问题