上拉加载在 RecyclerView 中应用已经十分普遍,很多封装好的 RecyclerView 框架中也都有集成该功能,但如果我们只是想在一个页面中实现该功能,引入一个第三方框架显然是不划算的。
闲言少叙书归正传:
OnLoadMoreListener.java
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| 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; } } } }
|
使用方法十分简单:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| 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时,说明已经没有更多数据了,我们一样需要调用移除监听器的接口。