Recyclerview表示到达最后一项

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Recyclerview表示到达最后一项相关的知识,希望对你有一定的参考价值。

我有一个recycleView,当我到达最后一个项目时我需要观察但是我注意到它总是表明我到达了最后一个项目,即使我还没有滚动。我的设置回收站的代码:

newsRecyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
newsRecyclerView.setFocusable(false);
newsRecyclerView.setNestedScrollingEnabled(false);
newsAdapter = new NewsAdapter(getContext(), newsDetails, categoryNumber);
newsRecyclerView.setAdapter(newsAdapter);
layoutManager = new LinearLayoutManager(getContext(), LinearLayoutManager.VERTICAL, false);

我的xml代码是:

            <android.support.v7.widget.RecyclerView
            android:id="@+id/news_recycler_view"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:padding="4dp"
            app:layout_constraintEnd_toEndOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintTop_toBottomOf="@+id/news_top_stories_title_text_view" />
答案

这是我放入我的Util中的代码,可以在任何地方使用。

Util.setRecyclerViewLastPositionListner(rv, linearLayoutManager , new UtilitiesV2.OnLastPositionReached() {
            @Override
            public void onReached() {
                // last position reached
            }
        });

把它放在Util中。

 private boolean userScrolled = true;
    int pastVisiblesItems, visibleItemCount, totalItemCount;


    public interface OnLastPositionReached {
        void onReached();
    }

    public void setRecyclerViewLastPositionListner(RecyclerView rvBooksMockTest, final LinearLayoutManager mLayoutManager, final OnLastPositionReached onLastPositionReached) {
        rvBooksMockTest.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                super.onScrollStateChanged(recyclerView, newState);
                if (newState == AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL) {
                    userScrolled = true;
                }
            }

            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {

                super.onScrolled(recyclerView, dx, dy);
                // Here get the child count, item count and visibleitems
                // from layout manager

                visibleItemCount = mLayoutManager.getChildCount();
                totalItemCount = mLayoutManager.getItemCount();
                pastVisiblesItems = mLayoutManager.findFirstVisibleItemPosition();

                // Now check if userScrolled is true and also check if
                // the item is end then update recycler view and set
                // userScrolled to false
                if (userScrolled && (visibleItemCount + pastVisiblesItems) == totalItemCount) {
                    userScrolled = false;
                    if (onLastPositionReached != null) onLastPositionReached.onReached();
                }
            }
        });
    }

更新根据您的要求,这里是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
            } else {
                //scroll view is not at bottom
            }
        }
    }
});
另一答案

将此代码添加到NewsAdapter类:

private List<News> mNewsList;

public NewsAdapter(Context context, List<NewDetails> newsList) {
    mNewsList = newsList;
}

private int size() {
   return mNewsList != null ? mNewsList.size() : 0;
}

@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
   if(position == size() - 1) {
       // TODO: Reach the last item in recycle view
   }
}

试一试!

另一答案

感谢Khemraj给出解决方案的提示,因为我在recyclerviewNestedScrollView中有一个coordinator layout作为他们的父母

我已经解决了这个问题:

public Disposable observeNestedScroll(LoadMoreListener listener) {
    return RxNestedScrollView.scrollChangeEvents(nestedScrollView)
            .subscribe(
                    viewScrollChangeEvent -> {
                        NestedScrollView nestedScrollView =(NestedScrollView) viewScrollChangeEvent.view();
                        if(nestedScrollView.getChildAt(nestedScrollView.getChildCount() - 1) != null) {
                            if ((viewScrollChangeEvent.scrollY() >= (nestedScrollView.getChildAt(nestedScrollView.getChildCount() - 1).getMeasuredHeight() - nestedScrollView.getMeasuredHeight())) &&
                                    viewScrollChangeEvent.scrollY() > viewScrollChangeEvent.oldScrollY()) {
                                listener.onLoadMore();
                            }
                        }
                    });
}

以上是关于Recyclerview表示到达最后一项的主要内容,如果未能解决你的问题,请参考以下文章

RecyclerView 项目中的片段替换

将视图保留在最后一项 - LoadMore RecyclerView

在RecyclerView项目中替换片段

RecyclerView 在最后一项之后删除分隔符/装饰器

RecyclerView 设置最后一个ArrayList项数据为第一项

RecyclerView 中使用 StaggeredGridLayout 的全宽页脚或最后一项