用RecyclerView展示錯誤和空白界面 附加詳情界面實踐-MultiItem進階

前言

本文是MultiItem系列的進階文章,講解如何展示空白、錯誤等狀態(tài)頁,這個功能比較常用,實現(xiàn)的思路也有很多,本文的思路是把狀態(tài)頁當(dāng)成一個填充滿RecyclerViewItem,不需要事先定義到布局中,然后利用庫中封裝的一個狀態(tài)頁輔助類進行管理,方便簡潔,并且做到了用時再去初始化,減少資源浪費。另外會附加講一下,對于展示業(yè)務(wù)中詳情頁的實踐,由于這個實踐目前比較簡單,所以就不單拿出來寫一篇文章了。MultiItem特點:

  • 直接使用業(yè)務(wù)中的實體類為RecyclerView Adapter設(shè)置數(shù)據(jù)源,不需要做任何封裝
  • RecyclerView Adapter零編碼,解放了復(fù)雜的Adapter
  • 支持DataBinding,讓你清爽的編寫列表代碼
  • 支持Form表單錄入,懶加載易復(fù)用,支持DataBinding、隱藏域、輸入內(nèi)容驗證及是否變化
  • 支持業(yè)務(wù)詳情頁展示
  • 支持空白、錯誤等狀態(tài)頁的展示

源碼地址

Github地址:https://github.com/free46000/MultiItem,請大家多多關(guān)注。

系列文章

效果截圖

空白錯誤頁
空白錯誤頁

詳情頁效果
詳情頁效果

用法

開啟數(shù)據(jù)綁定

由于用到了數(shù)據(jù)綁定的技術(shù),首先需要在build.gradle開啟DataBinding

dataBinding {
    enabled = true
}

狀態(tài)頁使用方法

狀態(tài)頁就是空白錯誤等頁面,首先初始化列表和輔助類,為列表設(shè)置點擊監(jiān)聽,處理狀態(tài)頁的展示。讓每個狀態(tài)對應(yīng)一個實例,使用起來更清晰。

protected void initViews() {
    //初始化adapter
    BaseItemAdapter adapter = new BaseItemAdapter();
    //為XXBean數(shù)據(jù)源注冊XXManager管理類
    adapter.register(TextBean.class, new TextViewManager());
    recyclerView.setAdapter(adapter);
    adapter.addDataItem(new TextBean("展示空白頁"));
    adapter.addDataItem(new TextBean("展示錯誤頁"));
    //設(shè)置點擊監(jiān)聽,再點擊Item的時候展示空白或者錯誤頁面
    setOnItemClickListener(adapter);
    //初始化空白頁輔助類
    emptyViewHelper = newStateViewHelper("列表數(shù)據(jù)為空");
    //初始化錯誤頁輔助類
    errorViewHelper = newStateViewHelper("數(shù)據(jù)加載錯誤");
}

/**
 * 創(chuàng)建新的狀態(tài)頁輔助類
 *
 * @param message 狀態(tài)頁展示的信息
 * @return StateViewHelper
 */
private StateViewHelper newStateViewHelper(String message) {
    //初始化狀態(tài)Item
    BaseItemState stateItem = new ItemEmptyAndError(message);
    //初始化輔助類,需要一個BaseItemState
    StateViewHelper stateViewHelper = new StateViewHelper(recyclerView, stateItem);
    //設(shè)置狀態(tài)頁按鈕的點擊事件監(jiān)聽,處理狀態(tài)頁隱藏
    stateItem.setOnStateClickListener(() -> errorViewHelper.hide());
    return stateViewHelper;
}

/**
 * 設(shè)置點擊監(jiān)聽,再點擊Item的時候展示空白或者錯誤頁面
 */
private void setOnItemClickListener(BaseItemAdapter adapter) {
    adapter.setOnItemClickListener(new OnItemClickListener() {
        @Override
        public void onItemClick(BaseViewHolder viewHolder) {
            switch (viewHolder.getItemPosition()) {
                case 0:
                    //展示空白頁
                    emptyViewHelper.show();
                    break;
                case 1:
                    //展示錯誤頁
                    errorViewHelper.show();
                    break;
            }
        }
    });
}

由上面代碼可以看出我們需要一個BaseItemState的類,Demo中自定義了一個ItemEmptyAndError的子類,使用了DataBinding的技術(shù),由于本身并沒有承載太多的業(yè)務(wù),只是對一些屬性進行存儲,邏輯基本都在xml布局中,下面我們看下布局的主要代碼:

<?xml version="1.0" encoding="utf-8"?>
<layout ... >

    <data>
        <variable
            name="itemData"
            type="com.freelib.multiitem.demo.state.ItemEmptyAndError"/>
    </data>

    <android.support.constraint.ConstraintLayout ... >

        <TextView
            //文本綁定
            android:text="@{itemData.message}"
            ... />

        <Button
            //點擊監(jiān)聽
            android:onClick="@{() -> itemData.onStateClickListener.onStateClick()}"
            //文本綁定
            android:text="@{itemData.btnText}"
            ... />
    </android.support.constraint.ConstraintLayout>
</layout>

詳情頁相關(guān)實踐

Demo中介紹了展示用戶詳情頁,并沒有復(fù)雜的界面,首先我們?yōu)槊恳粭l用戶信息項聲明一個ItemInfo實體,Demo里為了簡單,只實現(xiàn)了這一種類型,大家使用的時候視具體業(yè)務(wù)而定(例如:文章詳情功能:就需要,標題、內(nèi)容、回復(fù)等至少三種Item...)。
下面我們來看看相關(guān)實現(xiàn)代碼,組裝用戶展示項,并添加到列表中:

protected void initViews() {
    UserBean userBean = getUserBean();

    recyclerView.setLayoutManager(new LinearLayoutManager(this));
    //初始化adapter
    BaseItemAdapter adapter = new BaseItemAdapter();
    //為UserBean數(shù)據(jù)源注冊數(shù)據(jù)綁定View Holder Manager管理類
    adapter.register(ItemInfo.class, new DataBindViewHolderManager<>(
            R.layout.item_info, BR.itemData));
    recyclerView.setAdapter(adapter);

    //構(gòu)建用戶信息需要展示的ItemInfo的集合,每個ItemInfo代表頁面中的一行
    List<ItemInfo> list = new ArrayList<>(5);
    list.add(new ItemInfo("名字", userBean.getName()));
    list.add(new ItemInfo("性別", userBean.getSex()));
    list.add(new ItemInfo("年齡", userBean.getAge()));
    list.add(new ItemInfo("城市", userBean.getAddr()));
    list.add(new ItemInfo("介紹", userBean.getInfo()));
    adapter.setDataItems(list);
}

然后我們看下ItemInfo實體類,其實非常簡單:

public class ItemInfo {
    private String name;
    private String value;

    public ItemInfo(String name, String value) {
        this.name = name;
        this.value = value;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getValue() {
        return value;
    }

    public void setValue(String value) {
        this.value = value;
    }
}

可以看出上面的代碼中除了聲明了新的ItemInfo實體類以外,其余全部使用了已有的方法并且是MultiItem庫中已經(jīng)定義好的基礎(chǔ)類。所以用起來還是很輕的,希望大家多多嘗試。

總結(jié)

狀態(tài)界面采用輔助類的方式實現(xiàn),沒有侵入原有的業(yè)務(wù)代碼,并且對于每種狀態(tài)會生成對應(yīng)的實例去管理,使用起來更靈活,更簡潔。詳情界面是對已有功能的一個實踐,可能用戶詳情這個例子并不是特別適合,但是前面提到的文章詳情界面應(yīng)該更有說服力。期待大家多多挖掘?qū)嵱玫墓δ?,歡迎大家多多交流。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容