当setNestedScrollingEnabled为false时,Recyclerview onscrolllistener无法正常工作

Adn*_*Ali 10 android android-recyclerview android-nestedscrollview

我想实现分页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);
                        }
                    }

                }
            }
        });
Run Code Online (Sandbox Code Playgroud)

小智 5

这个问题可能已经过时了,但是为了帮助那些偶然发现这个问题的人,我想分享一下我的所作所为.我必须实现onScroll Listener来recyclerview从服务器加载数据并进行一些UI更改.并且还需要swipeRefresh Layout来刷新数据.

这是我的xml文件结构,

-RelativeLayout

 -SwipeRefreshLayout

  -NestedScrollView

   -LinearLayout(Vertical)

    -Multiple views required
Run Code Online (Sandbox Code Playgroud)

在此之后,为了检测向上和向下滚动,我将setOnScrollListener实现为NestedScrollView.

正常使用SwipeRefreshLayout刷新数据.

为了加载更多数据,我在NestedScrollingView的onScrollListener中实现了逻辑.

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

    // Load More Data
}
Run Code Online (Sandbox Code Playgroud)


Har*_*ddy 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;
            }
        }
    });
Run Code Online (Sandbox Code Playgroud)

从服务器加载数据后设置 boolean loading=true。


Vis*_*a ツ 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();
}
Run Code Online (Sandbox Code Playgroud)

步骤 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
                }
            }
        });
Run Code Online (Sandbox Code Playgroud)