Skip to content Skip to sidebar Skip to footer

How To Implement Endless Scrolling Using Staggeredlayoutmanager

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

Solution 1:

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.

privatebooleanloading=true;
privateint pastVisibleItems, visibleItemCount, totalItemCount;

mRecyclerView.setOnScrollListener(newRecyclerView.OnScrollListener({
        @OverridepublicvoidonScrolled(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");
            }
        }
    }
});

Solution 2:

This is my implementation of a ScrollListener.

Here's my code for implementing the ScrollListener:

privateEndlessScrollListenerscrollListener=newEndlessScrollListener(newEndlessScrollListener.RefreshList() {
        @OverridepublicvoidonRefresh(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:

classEndlessScrollListenerextendsRecyclerView.OnScrollListener {
    privateboolean isLoading;
    privateboolean hasMorePages;
    privateintpageNumber=0;
    private RefreshList refreshList;
    privateboolean isRefreshing;
    privateint pastVisibleItems;



    publicEndlessScrollListener(RefreshList refreshList) {
        this.isLoading = false;
        this.hasMorePages = true;
        this.refreshList = refreshList;
    }

    @OverridepublicvoidonScrolled(RecyclerView recyclerView, int dx, int dy) {
        super.onScrolled(recyclerView, dx, dy);
        StaggeredGridLayoutManagermanager=
            (StaggeredGridLayoutManager) recyclerView.getLayoutManager();

        intvisibleItemCount= manager.getChildCount();
        inttotalItemCount= 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;
                newHandler().postDelayed(newRunnable() {
                    @Overridepublicvoidrun() {
                        refreshList.onRefresh(pageNumber);
                    }
                }, 200);
            }
        } else {
            isLoading = false;
        }
    }

    publicvoidnoMorePages() {
        this.hasMorePages = false;
    }

    publicvoidnotifyMorePages() {
        isRefreshing = false;
        pageNumber = pageNumber + 1;
    }



    publicinterfaceRefreshList {
        voidonRefresh(int pageNumber);
    }
}

Solution 3:

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;

publicabstractclassEndlessRecyclerOnScrollListenerextendsRecyclerView.OnScrollListener {
    publicstaticStringTAG= EndlessRecyclerOnScrollListener.class.getSimpleName();
    privateintscrolledDistance=0;
    privatebooleancontrolsVisible=false;

    privatebooleanloading=true; // True if we are still waiting for the last set of data to load.privateintvisibleThreshold=5; // The minimum amount of items to have below your current scroll position before loading more.privateint pastVisibleItems, visibleItemCount, totalItemCount;

    privateintcurrent_page=1;

    private StaggeredGridLayoutManager mStaggeredGridLayoutManager;

    publicEndlessRecyclerOnScrollListener(StaggeredGridLayoutManager staggeredGridLayoutManager) {
        this.mStaggeredGridLayoutManager = staggeredGridLayoutManager;

    }

    @OverridepublicvoidonScrolled(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;
        } elseif (scrolledDistance < -1 && !controlsVisible) {
            controlsVisible = true;
            scrolledDistance = 0;
        }

        if ((controlsVisible && dy > 0) || (!controlsVisible && dy < 0)) {
            scrolledDistance += dy;
        }
    }

    publicabstractvoidonLoadMore(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) {

        Viewv= inflater.inflate(R.layout.notices_layout, container, false);

        mRecyclerView = (RecyclerView) v.findViewById(R.id.listaNoticias);
 mStaggeredGridLayoutManager = newStaggeredGridLayoutManager(
                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 = newMyAdapter(list, getContext());

//Adding adapter to recyclerview
mRecyclerView.setAdapter(adapter);

mRecyclerView.setOnScrollListener(newEndlessRecyclerOnScrollListener(mStaggeredGridLayoutManager) {
            @OverridepublicvoidonLoadMore(int current_page) {
                // do something...
                getData(current_page);
            }
        });

return v;
}

Solution 4:

int mSpanCount = 2;

int[] into = newint[mSpanCount];

int firstVisibleItem = staggeredGridLayoutManager.findFirstVisibleItemPositions(into)[0];

Post a Comment for "How To Implement Endless Scrolling Using Staggeredlayoutmanager"