Rxjava一行代碼爲RecyclerView添加EmptyView

來個效果先

簡介

先說說需求場景吧,微信閃動,是產品的頭像,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&&currentPage>=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,即可便捷完成各種功能,靈活的封裝.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章