[英]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.