拿來就用的 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時,說明已經沒有更多數據了,我們一樣需要調用移除監聽器的接口。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章