最近使用BaseQuickAdapter进行RecyclerView 的Adapter的数据绑定显示。
实现上拉加载与下拉刷新功能,遇到如下问题:
1、首先是实现下拉刷新、下拉加载的监听(xml布局就不贴出来了):
2、现在贴出来错误的处理方式:
不知道你们有没有遇到这种问题,我调用tradeListAdapter.loadMoreComplete();
最后显示结果总是会有重复的请求结果。最开始我以为是子线程调起请求导致的,就将请求放在了runOnUiThread里进行请求,结果也是一样;因为我用的OKHttp框架,回调是在子线程,所以我怀疑是不是这个原因导致的,所以在回调里也使用了runOnUiThread里刷新适配器,结果还是一样;
最后没办法,只能一步一步来分析代码了。
3、最后正确的刷新数据的方式:
@Override
public void onLoadMoreRequested() {
mRefreshLayout.setEnabled(false);
if (tradeListAdapter.getData().size() < PAGE_SIZE) {
tradeListAdapter.loadMoreEnd(true);
} else {
if (mCurrentCounter >= TOTAL_COUNTER) { //判断mCurrentCounter是否大于总数
// pullToRefreshAdapter.loadMoreEnd();//default visible
tradeListAdapter.loadMoreEnd(mLoadMoreEndGone);//true is gone,false is visible
} else {
if (isErr) {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
queryAll(mCurrentCounter, PAGE_SIZE, beginTime, endTime);
mCurrentCounter = tradeListAdapter.getItemCount();
tradeListAdapter.loadMoreComplete();
}
}, 1000);//一秒刷新
} else {
isErr = true;
tradeListAdapter.loadMoreFail();
}
}
mRefreshLayout.setEnabled(true);
}
}
4、原因就是出在这里了。使用new Handler().postDeloy(),成功解决该问题。
具体原理没大弄明白,但是从结果推测出:调用adapter.loadMoreComplete,刷新太快,mCurrentCount没取到相应的值,导致请求的offset (后台发起请求的偏移量,从第几条开始请求数据)不正确,所以会返回的结果是重复的。
研究不深,可能表述有些问题,敬请指点。