來個效果先
簡介
先說說需求場景吧,微信閃動,是產品的頭像,mmp,一直程序猿本能的反映到,一定不是啥好事.果然,要給所有RecyclerView添加空數據展位圖.我擦~爲啥子不早說,早說用ListView了,好歹還內置了一個EmptyView功能.
看了看項目裏的十多個RecyclerView,這可萬萬不能挨個修改佈局啊.於是想到可以通過吧EmptyView作爲一個item添加到RecyclerView中,剛好之前對列表類的都用了RxJava做了統一處理,於是很簡單的就加上了,分享一下心得.
刷新佈局 : SmartRefreshLayout (一個智能,便於自定義刷新頭尾的框架)
https://github.com/scwang90/SmartRefreshLayout
通用Adapter https://github.com/hongyangAndroid/baseAdapter
實現
之前代碼中做了關於上拉加載,關於是否還有下一頁設置上拉加載佈局的配置.
RetrofitHelper.getApiWithUid().getEvaluationList(method, reviewed, page)
.compose(RxScheduler.<EvaluationListResponse>defaultScheduler())
.doOnNext(new FinishLoadConsumer<EvaluationListResponse>(refreshLayout, page))
.subscribe(new BaseObserver<EvaluationListResponse>(mActivity) {
@Override
public void error(Throwable e) {
}
@Override
public void next(EvaluationListResponse evaluationListResponse) {
if (page == 1)
data.clear();
data.addAll(evaluationListResponse.getData().getList());
adapter.notifyDataSetChanged();
}
@Override
public void complete() {
}
});
用法類似這樣,在FinishLoadConsumer 中通過後臺的code判斷如果爲空數據,則添加null,在adapter中判斷如果item的數據有,且爲null,則添加空視圖佈局,把空數據視圖的文案讓後臺同學傳給你,就可以封裝到基類裏啦~
/**
* Created by fushuang on 2017/12/22.
*/
public class FinishLoadConsumer<T extends BaseResponse> implements Consumer<T> {
private final RefreshLayout refreshLayout;
private Integer currentPage;
private List<Object> list;
public FinishLoadConsumer(RefreshLayout refreshLayout) {
this.refreshLayout = refreshLayout;
}
public FinishLoadConsumer(RefreshLayout refreshLayout, Integer currentPage) {
this.refreshLayout = refreshLayout;
this.currentPage = currentPage;
}
@Override
public void accept(T t) throws Exception {
RecyclerView recyclerView = (RecyclerView) ((SmartRefreshLayout) refreshLayout).getChildAt(0);
if (t.getCode()!=0){
RecyclerView.Adapter rv_adapter = recyclerView.getAdapter();
if (rv_adapter instanceof CommonAdapter) {
CommonAdapter adapter = (CommonAdapter) rv_adapter;
adapter.getDatas().clear();
adapter.getDatas().add(null);
adapter.notifyDataSetChanged();
}else if (rv_adapter instanceof HeaderAndFooterWrapper){
HeaderAndFooterWrapper headerAndFooterWrapper = (HeaderAndFooterWrapper) rv_adapter;
headerAndFooterWrapper.mInnerAdapter.getDatas().clear();
headerAndFooterWrapper.mInnerAdapter.getDatas().add(null);
headerAndFooterWrapper.notifyDataSetChanged();
}
}else {
refreshLayout.setEnableLoadmore(true);
refreshLayout.setEnableLoadmore(true);
if (currentPage!=null&¤tPage>=t.getData().getSum_page()){
refreshLayout.setEnableLoadmore(false);
}else {
refreshLayout.setEnableLoadmore(true);
}
refreshLayout.finishLoadmore();
refreshLayout.finishRefresh();
}
}
}
關於adapter就不做展示了,只是默認添加一個null.
弘揚大神在adapter 中通過mItemViewDelegateManager 管理多種佈局,每次多一種類型的佈局添加一個ItemViewDelegate,通過isForViewType,convert分別控制是否應該加載當前佈局,應該怎麼加載.這種方式還是很好用的
RxJava 在網絡請求中的鏈式數據處理,對於處理這種問題也是極爲方便O(∩_∩)O,在請求的末端,只需要插裝自己需要功能的Consumer,即可便捷完成各種功能,靈活的封裝.