如果它位于NestedScrollView内且循环器具有nestedScrollingEnabled="false"
以便在RecyclerView上方平滑滚动其他视图,我如何获得recyclelerview中的第一个/最后一个完全可见的项目。
所有这些功能
int findFirstVisibleItemPosition();
int findFirstCompletelyVisibleItemPosition();
int findLastVisibleItemPosition();
int findLastCompletelyVisibleItemPosition();
返回在recyclerView中创建的第一个/最后一个项目。
我想找到当前可见的项目,因为我想让RecyclerView无限滚动,如果只剩下几个项目,我应该获取数据。
由于
答案 0 :(得分:1)
好吧,我无法找到两个Person
可以在RecyclerView
内的任何方式,并且仍然可以说明哪个项目在屏幕上可见。
所以我的解决方案是删除NestedScrollView
并使Vertical RecycelerView成为页面中的主视图,并添加Horizontal 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()
}
}
}
})