How to implement endless list with RecyclerView?

前端 未结 30 2643
无人及你
无人及你 2020-11-22 02:22

I would like to change ListView to RecyclerView. I want to use the onScroll of the OnScrollListener in RecyclerView to determine if a

30条回答
  •  北海茫月
    2020-11-22 03:21

    Try below:

    import android.support.v7.widget.GridLayoutManager;
    import android.support.v7.widget.LinearLayoutManager;
    import android.support.v7.widget.RecyclerView;
    import android.support.v7.widget.RecyclerView.LayoutManager;
    
    /**
     * Abstract Endless ScrollListener
     * 
     */
    public abstract class EndlessScrollListener extends
            RecyclerView.OnScrollListener {
        // The minimum amount of items to have below your current scroll position
        // before loading more.
        private int visibleThreshold = 10;
        // The current offset index of data you have loaded
        private int currentPage = 1;
        // True if we are still waiting for the last set of data to load.
        private boolean loading = true;
        // The total number of items in the data set after the last load
        private int previousTotal = 0;
        private int firstVisibleItem;
        private int visibleItemCount;
        private int totalItemCount;
        private LayoutManager layoutManager;
    
        public EndlessScrollListener(LayoutManager layoutManager) {
            validateLayoutManager(layoutManager);
            this.layoutManager = layoutManager;
        }
    
        public EndlessScrollListener(int visibleThreshold,
                LayoutManager layoutManager, int startPage) {
            validateLayoutManager(layoutManager);
            this.visibleThreshold = visibleThreshold;
            this.layoutManager = layoutManager;
            this.currentPage = startPage;
        }
    
        private void validateLayoutManager(LayoutManager layoutManager)
                throws IllegalArgumentException {
            if (null == layoutManager
                    || !(layoutManager instanceof GridLayoutManager)
                    || !(layoutManager instanceof LinearLayoutManager)) {
                throw new IllegalArgumentException(
                        "LayoutManager must be of type GridLayoutManager or LinearLayoutManager.");
            }
        }
    
        @Override
        public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
            super.onScrolled(recyclerView, dx, dy);
            visibleItemCount = recyclerView.getChildCount();
            totalItemCount = layoutManager.getItemCount();
            if (layoutManager instanceof GridLayoutManager) {
                firstVisibleItem = ((GridLayoutManager) layoutManager)
                        .findFirstVisibleItemPosition();
            } else if (layoutManager instanceof LinearLayoutManager) {
                firstVisibleItem = ((LinearLayoutManager) layoutManager)
                        .findFirstVisibleItemPosition();
            }
            if (loading) {
                if (totalItemCount > previousTotal) {
                    loading = false;
                    previousTotal = totalItemCount;
                }
            }
            if (!loading
                    && (totalItemCount - visibleItemCount) <= (firstVisibleItem + visibleThreshold)) {
                // End has been reached do something
                currentPage++;
                onLoadMore(currentPage);
                loading = true;
            }
        }
    
        // Defines the process for actually loading more data based on page
        public abstract void onLoadMore(int page);
    
    }
    

提交回复
热议问题