繁体   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