RecyclerViewStatus,一款針對RecyclerView的多狀態(tài)布局管理開源框架
開發(fā)中經(jīng)常會遇到列表的空、加載、錯誤等狀態(tài)的切換需求。而市面上針對RecyclerView的多狀態(tài)管理大概有以下兩種方案
在RecyclerView的上層節(jié)點(diǎn)添加新的父控件,當(dāng)需要顯示為內(nèi)容布局的時候則將RecyclerView進(jìn)行顯示;當(dāng)顯示其他狀態(tài)布局的時候則將RecyclerView隱藏并顯示對應(yīng)的容器
直接在RecyclerView的Adapter中定義多中itemViewType,然后在onBindViewHolder中判斷其itemViewType,再進(jìn)行相應(yīng)的處理。
兩種方法都有一些弊端,第一種方法的問題在于:由于添加了新的節(jié)點(diǎn)所以并不適用于某些特定的布局結(jié)構(gòu);而第二種方法由于侵入了原本的業(yè)務(wù)代碼導(dǎo)致adapter身兼多職,代碼維護(hù)效率極差。
那有沒有一種更好的方式,能在不影響布局層級的前提下兼顧維護(hù)效率?
本框架就是為此而生,并且使用理念極其簡單:
以下為使用文檔
在你的Activity/Fragment中直接創(chuàng)建RecyclerViewStatus作為成員變量
`
RecyclerViewStatus recyclerViewStatus = new RecyclerViewStatus();
`
PS:正式使用前確保 recyclerView已調(diào)用 setAdapter 和 setLayoutManager
`
//確保recyclerView setAdapter和setLayoutManager后調(diào)用attachToRecyclerView
recyclerViewStatus.attachToRecyclerView(recyclerView);
`
構(gòu)造您所需要的StateInflate即完成全部狀態(tài)的初始化
首個參數(shù)為狀態(tài)id(自定義),第二個參數(shù)為布局id,第三個等同于onBindViewHolder的回調(diào)(可忽略)
`
recyclerViewStatus.initStates(Arrays.asList(
new StateInflate("empty",R.layout.empty_layout),
new StateInflate<String>("error", R.layout.error_layout, new StateInflate.Block<String>() {
@Override
public void onBind(StateAdapter.StateViewHolder viewHolder, String s) {
viewHolder.getTextView(R.id.errorText).setText(s);
}
}),
new StateInflate("loading",R.layout.loading_layout)
));
`
接下來,只需要在你業(yè)務(wù)需要的場合調(diào)用showContent或者showState,即可切換至不同的狀態(tài)
`
//顯示原內(nèi)容
recyclerViewStatus.showContent();
//顯示加載狀態(tài)
recyclerViewStatus.showState("loading");
//顯示錯誤狀態(tài)
recyclerViewStatus.showState("error","網(wǎng)絡(luò)異常,無法獲取網(wǎng)絡(luò)");
`
實(shí)現(xiàn)原理
RecyclerViewStatus底層是基于切換recyclerView的Adapter和LayoutManager實(shí)現(xiàn)內(nèi)容布局到狀態(tài)布局的切換,并且在內(nèi)部管理了一個ConcatAdapter,動態(tài)add或remove對應(yīng)狀態(tài)的Adapter,從而實(shí)現(xiàn)具體狀態(tài)的切換。
傳送門
XXQAQ/RecyclerViewStatus: 針對RecyclerView的多狀態(tài)布局管理方案 (github.com)