一 說明:
項目中使用recyclerview的時候,經(jīng)常會在數(shù)據(jù)列表空白頁添加loding空白頁面灰殴,顯示一個特殊的empty view 來提示用戶。
二 實現(xiàn)思路
閱讀RecyclerView的源碼污秆,可以發(fā)現(xiàn)里面自帶了一個數(shù)據(jù)觀察者AdapterDataObserver用來監(jiān)聽數(shù)據(jù)的變化(代碼在下面)皂股,所以我們自然想到了砚哆,自定義一個RecyclerView,重寫里面的這個類屑墨,然后檢查數(shù)據(jù)源的個數(shù)是否為0,當(dāng)為空的時候纷铣,把我們先顯示的EmptyView顯示出來卵史,這個和以前ListView相似。思路比較簡單搜立,直接看看代碼是怎么實現(xiàn)的以躯。
源碼中AdapterDataObserver類
自定義RecyclerView
EmptyRecyclerView
private View emptyView;
private static final String TAG = "EmptyRecyclerView";
final private AdapterDataObserver observer = new AdapterDataObserver() {
@Override
public void onChanged() {
checkIfEmpty();
}
@Override
public void onItemRangeInserted(int positionStart, int itemCount) {
Log.i(TAG, "onItemRangeInserted" + itemCount);
checkIfEmpty();
}
@Override
public void onItemRangeRemoved(int positionStart, int itemCount) {
checkIfEmpty();
}
};
public EmptyRecyclerView(Context context) {
super(context);
}
public EmptyRecyclerView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public EmptyRecyclerView(Context context, AttributeSet attrs,
int defStyle) {
super(context, attrs, defStyle);
}
private void checkIfEmpty() {
if (emptyView != null && getAdapter() != null) {
final boolean emptyViewVisible =
getAdapter().getItemCount() == 0;
emptyView.setVisibility(emptyViewVisible ? VISIBLE : GONE);
setVisibility(emptyViewVisible ? GONE : VISIBLE);
}
}
@Override
public void setAdapter(Adapter adapter) {
final Adapter oldAdapter = getAdapter();
if (oldAdapter != null) {
oldAdapter.unregisterAdapterDataObserver(observer);
}
super.setAdapter(adapter);
if (adapter != null) {
adapter.registerAdapterDataObserver(observer);
}
checkIfEmpty();
}
//設(shè)置沒有內(nèi)容時,提示用戶的空布局
public void setEmptyView(View emptyView) {
this.emptyView = emptyView;
checkIfEmpty();
}
}
重寫AdapterDataObserver,每次數(shù)據(jù)變化都會調(diào)用onChanged(),所以就在這里檢查數(shù)據(jù)源是否為空忧设,看一下checkIfEmpty()方法,很簡單刁标,就是通過Adapter的getCount來判斷時候數(shù)據(jù)為空,空就顯示我們定義的EmptyView址晕。
最后在setAdapter的時候調(diào)用如下代碼就可以了膀懈。