[英]RecyclerView findLastCompletelyVisibleItemPosition always returns last element
StackOverflow 上的第一个问题!
我有一个无限滚动<\/strong>的 RecyclerView,前面有几个其他视图,都在 NestedScrollView 中。
每当我在 RecyclerView 的布局管理器上调用
findLastCompletelyVisibleItemPosition<\/code>时,我都会得到 RecyclerView 中加载的最后一个元素的位置......即使屏幕上只有第一个元素可见。
我相信这是因为 RecyclerView 位于 NestedScrollView 内——该项目正在显示,但我必须向下滚动才能查看它——但我肯定是错的。
Fragment OnViewCreated 中 RecyclerView 的初始化:
@Override
public void onViewCreated(@NonNull View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
//... irrelevant code ... //
photosRecyclerView = view.findViewById(R.id.profile_recyclerview_photos);
// Add LayoutManager to RecyclerView.
GridLayoutManager manager = new GridLayoutManager(getContext(), 2);
photosRecyclerView.setLayoutManager(manager);
// Smoothes scrolling from NestedScrollView.
photosRecyclerView.setNestedScrollingEnabled(false);
// Add adapter to RecyclerView.
profileRecyclerViewAdapter = new ProfileRecyclerViewAdapter(getContext(), photoList);
photosRecyclerView.setAdapter(profileRecyclerViewAdapter);
经过一些研究——从这个答案中得到了很多帮助,我意识到这种行为是由于 RecyclerView 高度设置为包装内容。 这会导致它立即加载所有项目,因此最后一个“完全可见”的项目是 RecyclerView 中的最后一个项目。
您可以尝试使用约束布局并将 recyclerview 高度更改为 0dp 。
它会解决你的问题
我最近遇到了回收站视图的问题,尝试了所有可能的解决方案,但仍然失败。 所以我想出了这个轻量级的解决方案。
binding.currencies.apply {
adapter = currencyPagingAdapter
}.addOnScrollListener(object : RecyclerView.OnScrollListener() {
override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) {
super.onScrollStateChanged(recyclerView, newState)
val lm = recyclerView.layoutManager as LinearLayoutManager
val lv = lm.getChildAt(lm.itemCount - 1)
val scrollBounds = Rect()
recyclerView.getHitRect(scrollBounds)
if (lv != null) {
if (lv.getLocalVisibleRect(scrollBounds)) {
Log.d("TAG", "onScrollStateChanged: visible")
} else {
Log.d("TAG", "onScrollStateChanged: not visible")
}
}
}
})
有同样的问题,我通过检测 nestedScrollView 何时结束来解决我的问题!
nestedScrollView.getViewTreeObserver().addOnScrollChangedListener(new ViewTreeObserver.OnScrollChangedListener() {
@Override
public void onScrollChanged() {
if (nestedScrollView != null) {
if (nestedScrollView.getChildAt(0).getBottom() <= (nestedScrollView.getHeight() + nestedScrollView.getScrollY())) {
//scroll view is at bottom
if (isAnythingToLoad && rowsArrayList.size() > 8) {
//bottom of list!
loadMore();
}
}
}
}
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.