How to implement Endless scrolling using StaggeredLayoutManager

前端 未结 4 2034
暖寄归人
暖寄归人 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: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;
    }
    

提交回复
热议问题