How to implement Endless scrolling using StaggeredLayoutManager

前端 未结 4 2035
暖寄归人
暖寄归人 2021-02-07 04:49

I already tried to implement the endless scrolling for LinearLayoutManager and it is successful and tried to copy the LinearLayoutManager implementation to StaggeredGridLayoutMa

相关标签:
4条回答
  • 2021-02-07 05:02

    I got it working:

    You can use one of two methods in the StaggeredGridLayoutManager:

    1. findFirstVisibleItemPositions(int[])
    2. findFirstCompletelyVisibleItemPositions(int[])

    Pass an empty int array that will get initialized with the positions and use the one that makes sense for you.

    private boolean loading = true;
    private int pastVisibleItems, visibleItemCount, totalItemCount;
    
    mRecyclerView.setOnScrollListener(new RecyclerView.OnScrollListener({
            @Override
            public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
    
            visibleItemCount = mLayoutManager.getChildCount();
            totalItemCount = mLayoutManager.getItemCount();
            int[] firstVisibleItems = null;
            firstVisibleItems = mLayoutManager.findFirstVisibleItemPositions(firstVisibleItems);
            if(firstVisibleItems != null && firstVisibleItems.length > 0) {
                pastVisibleItems = firstVisibleItems[0];
            }
    
            if (loading) {
                if ((visibleItemCount + pastVisibleItems) >= totalItemCount) {
                    loading = false;
                    Log.d("tag", "LOAD NEXT ITEM");
                }
            }
        }
    });
    
    0 讨论(0)
  • 2021-02-07 05:02
    int mSpanCount = 2;
    
    int[] into = new int[mSpanCount];
    
    int firstVisibleItem = staggeredGridLayoutManager.findFirstVisibleItemPositions(into)[0];
    
    0 讨论(0)
  • 2021-02-07 05:08

    This is my implementation of a ScrollListener.

    Here's my code for implementing the ScrollListener:

    private EndlessScrollListener scrollListener =
        new EndlessScrollListener(new EndlessScrollListener.RefreshList() {
            @Override public void onRefresh(int pageNumber) {
                //Here you can execute server connection or anything else to update data and present with Recycler view
                // Notice: It is sync method
    
            }
        });
    
    recyclerView.addOnScrollListener(scrollListener);
    

    Custom ScrollListener class:

    class EndlessScrollListener extends RecyclerView.OnScrollListener {
        private boolean isLoading;
        private boolean hasMorePages;
        private int pageNumber = 0;
        private RefreshList refreshList;
        private boolean isRefreshing;
        private int pastVisibleItems;
    
    
    
        public EndlessScrollListener(RefreshList refreshList) {
            this.isLoading = false;
            this.hasMorePages = true;
            this.refreshList = refreshList;
        }
    
        @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
            super.onScrolled(recyclerView, dx, dy);
            StaggeredGridLayoutManager manager =
                (StaggeredGridLayoutManager) recyclerView.getLayoutManager();
    
            int visibleItemCount = manager.getChildCount();
            int totalItemCount = manager.getItemCount();
            int[] firstVisibleItems = manager.findFirstVisibleItemPositions(null);
            if (firstVisibleItems != null && firstVisibleItems.length > 0) {
                pastVisibleItems = firstVisibleItems[0];
            }
    
            if ((visibleItemCount + pastVisibleItems) >= totalItemCount && !isLoading) {
                isLoading = true;
                if (hasMorePages && !isRefreshing) {
                    isRefreshing = true;
                    new Handler().postDelayed(new Runnable() {
                        @Override public void run() {
                            refreshList.onRefresh(pageNumber);
                        }
                    }, 200);
                }
            } else {
                isLoading = false;
            }
        }
    
        public void noMorePages() {
            this.hasMorePages = false;
        }
    
        public void notifyMorePages() {
            isRefreshing = false;
            pageNumber = pageNumber + 1;
        }
    
    
    
        public interface RefreshList {
            void onRefresh(int pageNumber);
        }
    }
    
    0 讨论(0)
  • 2021-02-07 05:18

    To implement EndlessRecyclerOnScrollListener first create EndlessRecyclerOnScrollListener java class

       import android.support.v7.widget.GridLayoutManager;
    import android.support.v7.widget.LinearLayoutManager;
    import android.support.v7.widget.RecyclerView;
    import android.support.v7.widget.StaggeredGridLayoutManager;
    
    public abstract class EndlessRecyclerOnScrollListener extends RecyclerView.OnScrollListener {
        public static String TAG = EndlessRecyclerOnScrollListener.class.getSimpleName();
        private int scrolledDistance = 0;
        private boolean controlsVisible = false;
    
        private boolean loading = true; // True if we are still waiting for the last set of data to load.
        private int visibleThreshold = 5; // The minimum amount of items to have below your current scroll position before loading more.
    
        private int pastVisibleItems, visibleItemCount, totalItemCount;
    
        private int current_page = 1;
    
        private StaggeredGridLayoutManager mStaggeredGridLayoutManager;
    
        public EndlessRecyclerOnScrollListener(StaggeredGridLayoutManager staggeredGridLayoutManager) {
            this.mStaggeredGridLayoutManager = staggeredGridLayoutManager;
    
        }
    
        @Override
        public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
            super.onScrolled(recyclerView, dx, dy);
    
            visibleItemCount = recyclerView.getChildCount();
            totalItemCount = mStaggeredGridLayoutManager.getItemCount();
            //firstVisibleItem = mStaggeredGridLayoutManager.findFirstVisibleItemPosition();
            int[] firstVisibleItems = null;
            firstVisibleItems = mStaggeredGridLayoutManager.findFirstVisibleItemPositions(firstVisibleItems);
            if (firstVisibleItems != null && firstVisibleItems.length > 0) {
                pastVisibleItems = firstVisibleItems[0];
            }
    
    
            if (loading) {
                if ((visibleItemCount + pastVisibleItems) >= totalItemCount) {
                    loading = false;
                    previousTotal = totalItemCount;
                }
            }
            if (!loading && (totalItemCount - visibleItemCount)
                    <= (pastVisibleItems + visibleThreshold)) {
                // End has been reached
    
                // Do something
                current_page++;
    
                onLoadMore(current_page);
    
                loading = true;
            }
    
            if (scrolledDistance > 1 && controlsVisible) {
                controlsVisible = false;
                scrolledDistance = 0;
            } else if (scrolledDistance < -1 && !controlsVisible) {
                controlsVisible = true;
                scrolledDistance = 0;
            }
    
            if ((controlsVisible && dy > 0) || (!controlsVisible && dy < 0)) {
                scrolledDistance += dy;
            }
        }
    
        public abstract void onLoadMore(int current_page);
    
        ;
    }
    

    After into your activity or fragment (this example is for fragment) use the next code

        RecyclerView mRecyclerView;
    StaggeredGridLayoutManager mStaggeredGridLayoutManager;
    
    private RecyclerView.Adapter adapter;
    
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle saveInstanceState) {
    
            View v = inflater.inflate(R.layout.notices_layout, container, false);
    
            mRecyclerView = (RecyclerView) v.findViewById(R.id.listaNoticias);
     mStaggeredGridLayoutManager = new StaggeredGridLayoutManager(
                    2, //number of grid columns
                    GridLayoutManager.VERTICAL);
    
    //Sets the gap handling strategy for StaggeredGridLayoutManager
            mStaggeredGridLayoutManager.setGapStrategy(StaggeredGridLayoutManager.GAP_HANDLING_NONE);
    
            mRecyclerView.setLayoutManager(mStaggeredGridLayoutManager);
    
    //initializing our adapter
    adapter = new MyAdapter(list, getContext());
    
    //Adding adapter to recyclerview
    mRecyclerView.setAdapter(adapter);
    
    mRecyclerView.setOnScrollListener(new EndlessRecyclerOnScrollListener(mStaggeredGridLayoutManager) {
                @Override
                public void onLoadMore(int current_page) {
                    // do something...
                    getData(current_page);
                }
            });
    
    return v;
    }
    
    0 讨论(0)
提交回复
热议问题