1. 程式人生 > >拿來就用的 RecyclerView 上拉載入

拿來就用的 RecyclerView 上拉載入

上拉載入在 RecyclerView 中應用已經十分普遍,很多封裝好的 RecyclerView 框架中也都有整合該功能,但如果我們只是想在一個頁面中實現改功能,引入一個第三方框架顯然是不划算的。

閒言少敘書歸正傳:
OnLoadMoreListener.java


import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;

public abstract class OnLoadMoreListener extends RecyclerView.OnScrollListener {

    private LinearLayoutManager layoutManager;
    private int itemCount, lastPosition, lastItemCount;
    private boolean loadEnable = true;

    public abstract void onLoadMore();

    /**
     * 允許載入更多,在回撥函式中處理
     */
    public void enableLoadMore() {
        loadEnable = true;
    }

    @Override
    public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
        if (recyclerView.getLayoutManager() instanceof LinearLayoutManager) {
            layoutManager = (LinearLayoutManager) recyclerView.getLayoutManager();

            itemCount = layoutManager.getItemCount();
            lastPosition = layoutManager.findLastCompletelyVisibleItemPosition();
        } else {
            Log.e("OnLoadMoreListener", "The OnLoadMoreListener only support LinearLayoutManager");
            return;
        }

        if (lastPosition>= itemCount - 2 && dy > 0) {
            if (loadEnable) {
                this.onLoadMore(); //在回撥中處理
                loadEnable = false;
            }
        }
    }
}

使用方法十分簡單:

mOnLoadMoreListener=new OnLoadMoreListener() {
            @Override
            public void onLoadMore() {
                Logger.d("請求載入更多"+minId);
                getMoreData();
            }
        };
mRecyclerView.addOnScrollListener(mOnLoadMoreListener);

...

 private void getMoreData() {
        OkHttpUtils.post()
                .url(URL.LIST_MORE)
                .params(parp)
                .build()
                .execute(new StringCallback() {
                    @Override
                    public void onError(Call call, Exception e, int id) {
                        
                    }

                    @Override
                    public void onResponse(String response, int id) {
                        ....
                        mAdapter.notifyDataSetChanged();
                        mOnLoadMoreListener.enableLoadMore(); //在網路請求完畢列表資料重新整理後呼叫允許再次載入
                    }
                });

關閉

我們應該首先與後臺確定好介面一次返回的資料數量(比如定為10),如果我們首次請求時,資料返回的數量小於這個值,則需要呼叫mRecyclerView.removeOnScrollListener(mOnLoadMoreListener);

同理在請求更多資料介面也是一樣的處理,當介面返回資料量小於10時,說明已經沒有更多資料了,我們一樣需要呼叫移除監聽器的介面。