当前位置: 首页 > 知识库问答 >
问题:

找不到回收器查看嵌套滚动视图中的可见项目位置

苏昊英
2023-03-14

如果recyclerview中的第一个/最后一个完全可见的项目位于嵌套滚动视图中,并且recycler具有nestedScrollingEnabled=“false”,可以与recyclerview上方的其他视图平滑滚动,那么如何获取该项目。

所有这些功能

int-findFirstVisibleItemPosition();int findFirstCompletelyVisibleItemPosition();int findLastVisibleItemPosition();int findLastCompletelyVisibleItemPosition()

返回在回收站视图中创建的第一个/最后一个项目。

我想找到当前可见的项目,因为我想让RecyclerView无限滚动,如果只剩下几个项目要滚动,我应该获取数据。

谢谢


共有3个答案

韩飞翮
2023-03-14

当我们在NestedScrollView中添加RecylerView时,在滚动函数findLastVisibleItemPosition时,始终返回列表中的最后一项。

所以我的解决方案是不要尝试查找RecyclerView的最后一个可见项。我将OnScrollChangeListener添加到NestedScrollView以检测最后一项。

scvHome.setOnScrollChangeListener(NestedScrollView.OnScrollChangeListener { v, scrollX, scrollY, oldScrollX, oldScrollY ->
            val isLoadingMore = homeViewModel.isLoadingMoreProduct.value ?: false
            if (!isLoadingMore) {
                v?.let {
                    val currentHeight = (v?.getChildAt(0).measuredHeight - v.measuredHeight)
                    if (scrollY == currentHeight && hasMoreProduct()) {
                        homeViewModel.loadMoreProduct()
                    }
                }
            }
        })
欧阳飞章
2023-03-14

好吧,我找不到任何方式可以让两个<code>RecyclerView</code>在<code>嵌套滚动视图</code>中,并且仍然可以说出哪个项目在屏幕上可见。

因此,我的解决方案是删除嵌套的ScrollView,并使垂直回收器视图成为页面中的主视图,并将水平回收器视图添加为垂直回收器的第一项。由于我只想知道垂直回收器的位置,因此我现在可以使用问题中提到的任何方法获得该位置。

巫马望
2023-03-14

您可以在nestedscrollview上添加scroll listner,并在滚动时检查nestedscrollview中放置的每个项目是否可见。下面是一个例子

  val scrollBounds = Rect()
  nestedScrollView?.getHitRect(scrollBounds)

  nestedScrollView?.addOnScrollListener(object : RecyclerView.OnScrollListener() {
         override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
                super.onScrolled(recyclerView, dx, dy)
                val scrollBounds = Rect()
                if (recyclerView != null && recyclerView.adapter != null
                            && recyclerView.adapter?.itemCount != null
                            && recyclerView.adapter?.itemCount!! > 0) {
                     for (i in 0 until recyclerView.adapter?.itemCount!!) {
                         var view = recyclerView?.findViewHolderForAdapterPosition(i)?.itemView

                         if (view != null) {
                            if (view.getLocalVisibleRect(scrollBounds)) {
                               if (!view.getLocalVisibleRect(scrollBounds)
                                            || scrollBounds.width() < view.getWidth()) {
                                        Logger.debugLog("WidgetScrolled", "BTN APPEAR PARCIALY")
                                    } else {
                                        Logger.debugLog("WidgetScrolled", "BTN APPEAR FULLY!!!")
                                    }
                                } else {
                                    Logger.debugLog("WidgetScrolled", "No")
                                }
                    }
               }
          }
      }
  })
 类似资料:
  • 当我在回收器视图中选择一个项目时,会自动选择多个项目 我正在做的是 我只想获取没有重复的联系人,并在recyclerview中列出所有联系人,并使两个文本视图可见(一个用于数字,第二个用于名称)。完成了,但问题是 当我点击一个项目时,它会被点击4次(例如,如果我点击一个项目,它会显示两个文本视图,但具有相同名称和编号的相同项目会显示出来,就像我点击了4个项目并看到图片一样) 适配器类 在那里我得到

  • 如果用户点击一个,我希望它做一些事情,也为两个和三个。我如何实现这一点?

  • 我在嵌套滚动视图中有一个回收器视图。当回收器视图中有太多数据时,滚动会滞后。除了将回收器视图从嵌套滚动视图中删除之外,还有什么方法可以解决这个问题吗?

  • 我有一个像这样的简单回收视图: 我在片段中的方法中添加了除法器: 我还有一个简单的适配器来保存这些项目。问题是,在我向上或向下滚动recyclerView之前,分隔线是不可见的。我试过了: 通过使用方法以编程方式滚动到最后一项和更新适配器中的项后的第一项。 添加NestedScrollView作为父级并滚动 通过对scrollView进行编程。 没什么帮助。分隔符仅在物理滚动后可见。最奇怪的是,我

  • 在我的中,我有一些项目,用户可以滚动查看。现在我想保存这个位置,回来后滚动那个位置。下面的代码总是返回0,我不能保存它: logcat:

  • 所以,这就是我的问题。我的recyclerview项目在底部有一个视图,我最初将其设置为消失。现在,当它们被点击时,我想让它们再次可见。所以在onClick方法中,我将视图设置为Visible。一切正常,但是当我向下滚动和向上滚动时,视图又隐藏了。我想这和取景模式有关。我想保持现状,即开放。我该怎么做?谢了。 视图支架: 点击: 编辑:上传的代码。此外,我尝试在onClick中更新Item的布尔值