无法在NestedScrollView中找到RecyclerView可见项目位置

时间:2017-04-12 13:05:42

标签: android android-recyclerview

如果它位于NestedScrollView内且循环器具有nestedScrollingEnabled="false"以便在RecyclerView上方平滑滚动其他视图,我如何获得recyclelerview中的第一个/最后一个完全可见的项目。

所有这些功能

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

返回在recyclerView中创建的第一个/最后一个项目。

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

由于

3 个答案:

答案 0 :(得分:1)

好吧,我无法找到两个Person可以在RecyclerView内的任何方式,并且仍然可以说明哪个项目在屏幕上可见。

所以我的解决方案是删除NestedScrollView并使Vertical RecycelerView成为页面中的主视图,并添加Horizo​​ntal NestedScrollView作为Vertical Recycler的第一项。由于我只想知道Vertical Recycler的位置,我现在可以通过使用问题中提到的任何方法来实现。

答案 1 :(得分:0)

您可以在nestedscrollview上添加滚动列表器,并在滚动时检查recylerview中的每个项目是否位于可见的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")
                                }
                    }
               }
          }
      }
  })

答案 2 :(得分:0)

当我们在 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()
                    }
                }
            }
        })