RecyclerView的兩種加載更多的寫法比較

關於RecyclerView的加載更多(重寫RecyclerView.OnScrollListener),網上廣泛有兩種寫法,來分析下兩種寫法的優劣: 1. 第一種,代碼以下,這種方法的原理是當RecyclerView持有的Item數量減去可見的Item數量後數目小於等於第一個可見Item,那麼列表就是能夠調用onLoadMore這個方法的,看上去頗有道理,假如手機一屏剛好是四個Item都顯示出來了,這個時候itemCount和previousItemCount是相等的,這個時候isRefreshing恆等於false,因此不管如何都是不會調用onLoadMore的.ide

/**
     * 用於RecyclerView加載更多的監聽器
     */
    public abstract class OnLoadMoreListener extends RecyclerView.OnScrollListener {
        private int lastVisibleItem;

        private int itemCount;//全部的Item個數
        private int visibleItemCount;//可見Item的個數
        private int firstVisibleItem;//第一個可見的Item 的position
        private int previousItemCount;//滑動以前的Item數目

        private boolean isRefreshing = true;

        /**
         * 重寫此抽象方法,實現加載更多
         */
        protected abstract void onLoadMore();


        @Override
        public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
            super.onScrolled(recyclerView, dx, dy);

            itemCount = getLayoutManager().getItemCount();
            visibleItemCount = recyclerView.getChildCount();
            if (getLayoutManager() instanceof LinearLayoutManager) {
                firstVisibleItem = ((LinearLayoutManager) recyclerView.getLayoutManager()).findFirstVisibleItemPosition();
            }

            if (isRefreshing) {
                if (itemCount > previousItemCount) {
                    isRefreshing = false;
                    previousItemCount = itemCount;
                }
            }

            if (!isRefreshing && (itemCount - visibleItemCount) <= firstVisibleItem) {
                onLoadMore();//加載更多的邏輯寫在這個方法裏,好比請求數據
                isRefreshing = true;
            }
        }
    }
2. 第二種,代碼以下,原理就是當RecyclerView中止滑動的時候,判斷最後一個Item的Position+1是否等於Item的總數量,是就下拉加載更多,這種的話,我的認爲是比較合理的加載更多的寫法:
private class OnLoadMoreListener extends RecyclerView.OnScrollListener{

    private int lastVisibleItem;
    private int itemCount;

        @Override
        public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
            super.onScrollStateChanged(recyclerView, newState);


            if (newState == RecyclerView.SCROLL_STATE_IDLE){
                        
            if (lastVisibleItem + 1 == itemCount && newState == RecyclerView.SCROLL_STATE_IDLE){
                onloadMore();
            }
        }

        @Override
        public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
            super.onScrolled(recyclerView, dx, dy);
            lastVisibleItem = ((LinearLayoutManager) recyclerView.getLayoutManager()).findLastVisibleItemPosition();
            itemCount = recyclerView.getAdapter().getItemCount();
        }
    }
相關文章
相關標籤/搜索