前言
本文是MultiItem系列的進階文章,講解如何展示空白、錯誤等狀態(tài)頁,這個功能比較常用,實現(xiàn)的思路也有很多,本文的思路是把狀態(tài)頁當(dāng)成一個填充滿RecyclerView的Item,不需要事先定義到布局中,然后利用庫中封裝的一個狀態(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)注。
系列文章
- MultiItem用法與詳解-優(yōu)雅的實現(xiàn)多類型
- MultiItem進階 實現(xiàn)Head Foot和加載更多
- MultiItem進階 使用DataBinding讓RecyclerView代碼更簡潔清爽
- MultiItem進階 讓我們用RecyclerView實現(xiàn)錄入Form表單 給你一個新思路
- MultiItem擴展 仿任務(wù)面板 跨多個RecyclerView的Item拖動 支持縮小后拖動
效果截圖


用法
開啟數(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ū)嵱玫墓δ?,歡迎大家多多交流。