首页 > 解决方案 > RecyclerView scrollToPosition() 将项目放在底部。我怎样才能把它带到TOP?

问题描述

我有一个RecyclerView显示字符串的垂直列表:

Row0
Row1
Row2
Row3
Row4
...

我正在使用该功能recyclerView.scrollToPosition(position);跳转到一行。但是,我想跳转到的行最终位于视图的底部!

例如,如果我这样做,recyclerView.scrollToPosition(17);我会得到:

Row13
Row14
Row15
Row16
Row17  <--- 17 is at bottom (last visible row)

我想要的是:

Row17  <-- 17 to be on top (first visible row)
Row18
Row19
Row20
Row21 

我怎样才能做到这一点?

标签: javaandroidandroid-recyclerviewandroid-arrayadapter

解决方案


的默认行为.scrollToPosition()是在您滚动到的行出现在屏幕上时停止滚动。您可以使用scrollToPositionWithOffset()固定的偏移量,以便它总计为滚动值。

LinearLayoutManager layoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();
if (layoutManager != null) {
    layoutManager.scrollToPositionWithOffset(position, 20);
}

更新

如何计算偏移值?我的 RecyclerView 中的每一行都有不同的高度。我也不知道如何测量它。

现在您可以计算屏幕上第一个和最后一个可见项目之间的差异,并且仅当屏幕上的最后一个可见项目是您想要首先推送到的当前项目时才有效。

layoutManager.scrollToPosition(position));

int firstItemPosition = ((LinearLayoutManager) recyclerview.getLayoutManager())
            .findFirstCompletelyVisibleItemPosition();

int lastItemPosition = ((LinearLayoutManager) recyclerview.getLayoutManager())
            .findLastCompletelyVisibleItemPosition();

layoutManager.scrollToPositionWithOffset(position, 
            Math.abs(lastItemPosition - firstItemPosition));

推荐阅读