【问题标题】:RecyclerView inside NestedScrollView does not give correct visible item positionNestedScrollView 内的 RecyclerView 没有给出正确的可见项目位置
【发布时间】:2018-01-24 17:54:34
【问题描述】:

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

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 总是最终成为列表中的最后一项,无论它是否真的在屏幕上。我哪里出错了?

【问题讨论】:

  • 设置recyclerview.setnestedscrolllingenabled(false);
  • 我做到了。没有区别。
  • 你的recyclerview的高度是多少?
  • 我尝试了 wrap_content 和 match_parent。第一个可见项始终是第一个列表项,最后一个始终是最后一项。

标签: android android-recyclerview kotlin android-nestedscrollview


【解决方案1】:

如果您将RecyclerView 放入可滚动容器(在您的情况下为NestedScrollView),它基本上会变成一个花哨的LinearLayout,同时膨胀并显示所有项目。您将第一个和最后一个项目作为可见的第一个和最后一个项目,因为对于 RecyclerView,它们是可见的。所有项目都被膨胀和添加,所以它们都在可滚动视图内“在屏幕上可见”。

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

【讨论】:

  • 那么,当recyclerview在nestedscrollview里面的时候,有没有办法阻止recyclerview一次性膨胀所有的项目?
  • 如果我们要实现折叠应用栏怎么办@David
  • @ParthAnjaria 然后您将 CoordinatorLayout 与 AppBarLayout 和 RecyclerView 一起使用。网上应该有很多例子
  • 如果我想用recyclerview添加滑动刷新怎么办? @DavidMedenjak
  • @NevilGhelani SwipeRefreshLayout 不会干扰房车回收
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-28
    • 1970-01-01
    • 1970-01-01
    • 2018-10-26
    • 1970-01-01
    • 2016-09-01
    • 2016-10-20
    • 1970-01-01
    相关资源
    最近更新 更多