NestedScrollView中的RecyclerView未提供正确的可见项位置

时间:2018-01-24 17:54:34

标签: android android-recyclerview kotlin android-nestedscrollview

我在RecyclerView内有一个NestedScrollView,我正在尝试使用滚动事件期间获取最后一个可见列表项的位置。以下代码允许我可靠地检测滚动事件:

val recyclerView = nestedScrollView.getChildAt(0) as RecyclerView

nestedScrollView.setOnScrollChangeListener { v: NestedScrollView?, scrollX: Int, scrollY: Int, oldScrollX: Int, oldScrollY: Int ->
    val layoutManager = recyclerView?.layoutManager as? LinearLayoutManager
    val lastVisiblePosition = layoutManager?.findLastVisibleItemPosition()
}

然而问题是,lastVisiblePosition总是最终成为列表中的最后一项,无论这是否实际上是在scree上。我哪里可能出错?

2 个答案:

答案 0 :(得分:7)

如果你将一个RecyclerView放在一个可滚动的容器 - 一个NestedScrollView的情况下 - 它将基本上变成一个花哨的LinearLayout,一次性地膨胀并显示所有项目。你得到第一个和最后一个项目作为第一个和最后一个可见因为 - 对于RecyclerView - 它们是。所有项目都被充气和添加,因此所有这些项目都在可滚动视图内“在屏幕上可见”。

简单的解决方案是不将RecyclerView嵌套在NestedScrollView中。 RecyclerView可以滚动,因此您可以在RecyclerView中放置所需的页眉或页脚。嵌套可滚动视图总是有缺点,你应该尽可能避免它。

答案 1 :(得分:0)

在研究了很多网站后,找不到使用 findLastVisibleItemPosition 方法的解决方案。我使用了另一个解决方案并在那里回答了它:
Can't find RecyclerView visible item position inside NestedScrollView