13

我想用 实现分页recyclerView,为此我添加addOnScrollListenerrecyclerView但是我在设置时遇到了RecyclerView.OnScrollListener无法工作的问题rvGridExplore.setNestedScrollingEnabled(false);

但是当我删除rvGridExplore.setNestedScrollingEnabled(false);它时工作正常,我不知道如何处理这个。

这是代码:

rvGridExplore = (RecyclerView) view.findViewById(R.id.rvGridExplore);
        final GridLayoutManager glm = new GridLayoutManager(context,2);
       // rvGridExplore.setNestedScrollingEnabled(false);
        rvGridExplore.setLayoutManager(glm);

       // final int visibleItemCount,totalCount,pastVisibleItems;
        rvGridExplore.addOnScrollListener(new RecyclerView.OnScrollListener() {
            @Override
            public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
                super.onScrollStateChanged(recyclerView, newState);
                Log.v("scrollll","state changed");
            }

            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
                super.onScrolled(recyclerView, dx, dy);
                if (dy > 0) {
                    int totalCount = glm.getItemCount();
                    int visibleItemCount = glm.getChildCount();
                    int pastVisibleItems = glm.findFirstVisibleItemPosition();
                    if (loading) {
                        if ((visibleItemCount + pastVisibleItems) >= totalCount) {
                            Log.v("scroll","scrolled"+pastVisibleItems);
                        }
                    }

                }
            }
        });
4

6 回答 6

6

这个问题可能很老,但为了帮助其他偶然发现这个问题的人,我想分享我所做的。我必须实现 onScroll Listener 才能recyclerview从服务器加载数据并进行一些 UI 更改。并且还需要 swipeRefresh 布局来刷新数据。

这是我的 xml 文件结构,

-RelativeLayout

 -SwipeRefreshLayout

  -NestedScrollView

   -LinearLayout(Vertical)

    -Multiple views required

在此之后,为了检测上下滚动,我将 setOnScrollListener 实现到 NestedScrollView。

正常使用 SwipeRefreshLayout 刷新数据。

为了加载更多数据,我实现了 NestedScrollingView 的 onScrollListener 内部的逻辑。

if (scrollY == (v.getChildAt(0).getMeasuredHeight() - v.getMeasuredHeight()))  {

    // Load More Data
}
于 2017-03-28T06:32:45.967 回答
5

将 setOnScrollChangeListner 添加到您的 NestedScrollView

 nestedScrollview.setOnScrollChangeListener(new NestedScrollView.OnScrollChangeListener() {
        @Override
        public void onScrollChange(NestedScrollView v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {
            if (scrollY == (v.getChildAt(0).getMeasuredHeight() - v.getMeasuredHeight()))  {
               if(loading)
                onClick();
               loading=false;
            }
        }
    });

从服务器加载数据后设置布尔加载=真。

于 2018-07-24T08:24:06.833 回答
2

如果您将 recyclerView 嵌入到任何NestedScrollView中,那么您应该将 onScrollListener 附加到 NestedScrollView。

这会奏效!

if (recyclerView.getLayoutManager() instanceof GridLayoutManager) {
    final GridLayoutManager gridLayoutManager = (GridLayoutManager) recyclerView.getLayoutManager();
    nestedScrollView.setOnScrollChangeListener(new NestedScrollView.OnScrollChangeListener() {
        @Override
        public void onScrollChange(NestedScrollView v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {
            if (scrollY == (v.getChildAt(0).getMeasuredHeight() - v.getMeasuredHeight()))  {
                totalItemCount = gridLayoutManager.getItemCount();
                lastVisibleItem = gridLayoutManager.findLastVisibleItemPosition();
                if (!loading
                        && totalItemCount <= (lastVisibleItem + visibleThreshold)) {
                    // End has been reached
                    // Do something
                    if (onLoadMoreListener != null) {
                        onLoadMoreListener.onLoadMore();
                    }
                    loading = true;
                }
            }
        }
    });
}
于 2020-04-11T10:09:06.533 回答
1

您在对您的问题的评论中说“
它位于协调器布局下的 NestedScrollView 下,如果我删除它,则工具栏不会向上滚动”。这是一个错误

我发现你不能同时拥有它,CoordinatorLayout当你有一个你添加了行为的RecyclerView内部时,行为就会中断。NestedScrollView您需要使用其中一种。

当你有一个RecyclerView内部NestedScrollView时,只要你设置它就可以工作RecyclerView.setNestedScrollingEnabled(false),但是你发现这意味着OnScrollListener没有调用。

所有组件正常工作的唯一方法是删除NestedScrollView,确保没有将嵌套滚动设置为 false并从那里开始工作。否则RecyclerView.OnScrollListener事件将无法正确触发。

于 2018-01-10T11:08:24.473 回答
0

删除嵌套滚动视图使用线性或相对布局而不是它作为根元素然后你可以写 recyclerview.setNestedScrollEnabled(false);

于 2018-06-22T07:07:43.957 回答
0

第 1 步:创建 EndlessRecyclerOnScrollListener

public abstract class EndlessRecyclerOnScrollListener extends RecyclerView.OnScrollListener {

    public static String TAG = EndlessRecyclerOnScrollListener.class.getSimpleName();

    // use your LayoutManager instead
    private LinearLayoutManager llm;

    public EndlessRecyclerOnScrollListener(LinearLayoutManager sglm) {
        this.llm = llm;
    }

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

        if (!recyclerView.canScrollVertically(1)) {
            onScrolledToEnd();
        }
    }

    public abstract void onScrolledToEnd();
}

第 2 步:将滚动侦听器应用于回收站视图。

recyclerview.addOnScrollListener(new EndlessRecyclerOnScrollListener(mLayoutManager) {
            @Override
            public void onScrolledToEnd() {
                Log.e("Position", "Last item reached");
                if (loadMore == true) {
                    // put your Load more code
                    // add 10 by 10 to tempList then notify changing in data
                }
            }
        });
于 2016-07-04T08:37:49.640 回答