查找RecyclerView中第一个可见项目的顶部偏移量

时间:2015-12-01 19:27:50

标签: android android-recyclerview linearlayoutmanager

我有一个RecyclerView + LinearLayoutManger,它使用一个包含聊天消息的适配器。我将聊天消息的数量限制在最近的100个。这个问题是,当我删除旧的聊天时,recyclerview中聊天的滚动位置会发生变化,因为索引0已被删除。我开始编写下面的代码:

int firstVisiblePosition = layoutManager.findFirstVisibleItemPosition();
View v = layoutManager.getChildAt(firstVisiblePosition);
if (firstVisiblePosition > 0 && v != null) {
    int offsetTop = //need to get the view offset here;
    chatAdapter.notifyDataSetChanged();

    if (firstVisiblePosition - 1 >= 0 && chatAdapter.getItemCount() > 0) {
        layoutManager.scrollToPositionWithOffset(firstVisiblePosition - 1, offsetTop);
    }
}

我认为很容易获得第一个可见项目位置的可见偏移量。防爆。如果第一个可见视图是300dp但只有最后200dp是可见的,我想得到100偏移量。

这样我可以使用scrollToPositionWithOffset(firstVisiblePosition - 1,offsetTop)。

我在这里遗漏了什么吗?这似乎是一个容易解决的问题,但我还没有看到任何方法可以支持这一点。

1 个答案:

答案 0 :(得分:10)

@Blackbelt。感谢您让我走上正轨。

我需要的偏移实际上只是v.getTop();

我真正的问题在于getChildAt()。显然getChildAt从第一个可见位置开始,而不是在适配器的位置。在这种情况下,文档写得不好。

以下是生成的代码。

int firstVisiblePosition = layoutManager.findFirstVisibleItemPosition();
View v = layoutManager.getChildAt(0);
if (firstVisiblePosition > 0 && v != null) {
    int offsetTop = v.getTop();
    chatAdapter.notifyDataSetChanged();

    if (firstVisiblePosition - 1 >= 0 && chatAdapter.getItemCount() > 0) {
         layoutManager.scrollToPositionWithOffset(firstVisiblePosition - 1, offsetTop);
    }
}