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

我有一个RecyclerView + LinearLayoutManger正在使用一个适配器持有聊天消息。 我将聊天消息的数量限制在最近的100个。 这个问题是,当我删除旧的聊天,回收站查看聊天的滚动位置改变,因为索引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)。

我在这里错过了什么? 这似乎是一个简单的问题,但我还没有看到任何方法可以支持这一点。

Solutions Collecting From Web of "查找RecyclerView中第一个可见项的顶部偏移量"

@黑带。 谢谢你让我走上正轨。

我需要的偏移量实际上只是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); } }