簡體   English   中英

"RecyclerView findLastCompletelyVisibleItemPosition 總是返回最后一個元素"

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM