首页 > 解决方案 > 恢复准确的 Recyclerview 位置 - 包含不同大小的项目列表

问题描述

在尝试了许多解决方案后,我仍然无法解决问题。请帮忙。

我的 Android 应用程序有一个包含大项目列表的 Recyclerview。一个项目可以是 2 行或 35 行。

从 Recyclerview 屏幕切换到另一个屏幕时,我想保存确切的位置,这样我就可以回到完全相同的位置。

当然,我花了很多时间寻找解决方案,但没有找到明确的解决方案。一些解决方案如下所示:

1 - 使用:computeVerticalScrollOffset:

int offset = recyclerView.computeVerticalScrollOffset();

2 - 使用:findFirstVisibleItemPosition 和 getTop() 和 paddingTop()

int index = linearLayoutManager.findFirstVisibleItemPosition();
View v = recyclerView.getChildAt(0);
int offset = (v == null) ? 0 : (v.getTop() - recyclerView.getPaddingTop());

3 - 使用 findFirstVisibleItemPosition 和 getTop()

int firstVisiblePosition = linearLayoutManager.findFirstVisibleItemPosition();
View visibleEntry = linearLayoutManager.findViewByPosition( firstVisiblePosition);
int offset = visibleEntry.getTop();      

使用这些位置,我可以滚动到确切的位置:

recyclerView.scrollToPosition( index);
    new Handler().postDelayed(new Runnable() {
        @Override
        public void run() {
            recyclerView.scrollBy(0, - offset);
        }
    }, 500);

所有版本都不正确。

如何解决当前位置...并轻松恢复?

ListView 有一个简单的解决方案,但我当然不想回到 ListView ;-)

标签: androidandroid-recyclerview

解决方案


终于找到了一个很好的答案!

保存“位置”是一个已知的解决方案:

int position = linearLayoutManager.findFirstVisibleItemPosition();
View visibleChildView = recyclerView.getChildAt(0);
int offset = (visibleChildView  == null) ? 0 : (visibleChildView .getTop() - recyclerView.getPaddingTop());

但是,通过 linearLayoutManager 使用位置对我来说是新的:

if ( position != -1) {  
    linearLayoutManager.scrollToPositionWithOffset( position, offset);
}

令人惊讶的是,这个选项看起来非常像旧的 Listview 解决方案 ;-)


推荐阅读