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