拿來就用的 RecyclerView 上拉載入
阿新 • • 發佈:2018-12-29
上拉載入在 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時,說明已經沒有更多資料了,我們一樣需要呼叫移除監聽器的介面。