BaseQuickAdapter上拉加载下拉刷新
2020-07-29 本文已影响0人
jiluyixia
首先导入
implementation 'com.github.CymChad:BaseRecyclerViewAdapterHelper:2.9.50'
上拉下拉,选择布局SmartRefreshLayout:
<com.scwang.smartrefresh.layout.SmartRefreshLayout
android:id="@+id/ly_pull_refresh"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/color_white"
android:orientation="vertical"
app:srlReboundDuration="600">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recharge_list"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="@color/color_f7f7f7"
android:overScrollMode="never"
android:scrollbars="none"/>
</com.scwang.smartrefresh.layout.SmartRefreshLayout>
初始化控件,并创建一个BaseQuickAdapter
static final int PAGE_SIZE = 10;//每次加载10项
int page = 1;//加载第一页
RechargeListItemAdapter mRechargeListItemAdapter;
@BindView(R.id.ly_pull_refresh)
SmartRefreshLayout mRefreshLy;
@BindView(R.id.recharge_list)
RecyclerView mRechargeListRV;
public class RechargeListItemAdapter extends BaseQuickAdapter<RechargeListBean, BaseViewHolderExt> {
public RechargeListItemAdapter(@Nullable List<RechargeListBean> data) {
super(R.layout.fragment_recharge_list_item, data);
}
@Override
protected void convert(@NonNull BaseViewHolderExt helper, RechargeListBean item) {
helper.setText(R.id.status_str, item.getStatus_str())
.setText(R.id.money, item.getMoney())
.setText(R.id.op_name, item.getOp_name())
.setText(R.id.created_time, item.getCreated_time());
}
}
设置下拉刷新:
mRefreshLy.setOnRefreshListener(refreshLayout -> {
page = 1;//设为默认加载第一页
selectBill(false, false);//获取数据
});
设置adapter:
public void onLazyInitView(@Nullable Bundle savedInstanceState) {
super.onLazyInitView(savedInstanceState);
mRechargeListItemAdapter = new RechargeListItemAdapter(null);
mRechargeListItemAdapter.setEmptyView(new YJGEmptyView(getContext(), YJGEmptyView.TYPE_ORDER));//为空时布局
mRechargeListItemAdapter.setLoadMoreView(new YJGLoadMoreView());//上来加载时,加载的布局
mRechargeListItemAdapter.setEnableLoadMore(false);//默认设置不能加载更多
mRechargeListItemAdapter.setPreLoadNumber(3);
mRechargeListItemAdapter.setOnLoadMoreListener(() -> {//设置加载更多监听
selectBill(false, true);//获取数据
});
mRechargeListRV.setAdapter(mRechargeListItemAdapter);
selectBill(true, false);//初始化获取参数
}
获取参数的代码:
public void selectBill(boolean loading, boolean isLoadMore){
if (loading) {//刚进入页面时,需要显示加载菊花
showLoading();
}
RetrofitClient.getInstance().getApiService()
.getRechargeList(page,PAGE_SIZE)//获取网络数据参数
.map(new ResultTransformFunction<>())
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(RechargeListBean -> {
hideLoading();//隐藏菊花
mRefreshLy.finishRefresh();//完成刷新
if (isLoadMore) {
mRechargeListItemAdapter.loadMoreComplete();//网络请求成功的话调用loadMoreComplete()
}
if (RechargeListBean != null && RechargeListBean.size() > 0) {//有了请求数据
if (isLoadMore) {//为true时,是加载更多获取的数据
mRechargeListItemAdapter.addData(RechargeListBean);//加载更多的数据,add进去
} else {
mRechargeListItemAdapter.setNewData(RechargeListBean);//进入或者上拉加载的数据(page=1),setnewdata
}
Log.v("re22","33333==="+PAGE_SIZE+"=="+RechargeListBean.size());
if (RechargeListBean.size() == PAGE_SIZE) {//获取的数据未10条时,说明还有下一页,page加1,以备下次请求
page++;
mRechargeListItemAdapter.setEnableLoadMore(true);//允许加载更多
} else {
mRechargeListItemAdapter.loadMoreEnd(true);//若这次获得的数据没有10条,说明全部加载完毕。
}
}
Log.v("aaa2","=="+RechargeListBean.size());
}, throwable -> {
hideLoading();
mRefreshLy.finishRefresh();
if (isLoadMore) {
mRechargeListItemAdapter.loadMoreFail();//请求失败的话调用loadMoreFail()
}
showToast(throwable.getMessage());
});
}
就这样,就实现了上拉和下拉。
但是有个疑问,adapter是怎么监听上拉加载的呢,也就是setOnLoadMoreListener是怎么执行的呢。
mRechargeListItemAdapter.setOnLoadMoreListener(() -> {//设置加载更多监听
selectBill(false, true);//获取数据
});
换一种写法:
mAdapter.setOnLoadMoreListener(new BaseQuickAdapter.RequestLoadMoreListener() {
@Override
public void onLoadMoreRequested() {
}
});
也就是,这个onLoadMoreRequested是如何执行的。
通过参考资料BaseQuickAdapter和BaseMultiItemQuickAdapter使用,
里面对源码的分析,有一个关键方法:
autoLoadMore(position);
在getItemViewType里面,有个autoLoadMore(position);,在2.9.50版本,这个方法在onBindViewHolder里面。
//通过position,来判断还有没有更多内容,然后调用onLoadMoreRequested
private void autoLoadMore(int position) {
if (this.getLoadMoreViewCount() != 0) {
if (position >= this.getItemCount() - this.mPreLoadNumber) {
if (this.mLoadMoreView.getLoadMoreStatus() == 1) {
this.mLoadMoreView.setLoadMoreStatus(2);
if (!this.mLoading) {
this.mLoading = true;
if (this.getRecyclerView() != null) {
this.getRecyclerView().post(new Runnable() {
public void run() {
BaseQuickAdapter.this.mRequestLoadMoreListener.onLoadMoreRequested();
}
});
} else {
this.mRequestLoadMoreListener.onLoadMoreRequested();
}
}
}
}
}
}