EmptyViewを設定できるRecyclerViewのカスタマイズ
8545 ワード
EmptyViewを設定できるRecyclerViewのカスタマイズ
ListViewにはsetEmptyViewメソッドがあります.ListViewデータが空または0の場合、設定されたEmptyViewを表示できるので便利です.しかし、RecyclerViewにはこの方法はありません.
以下はネットで見つけた方法です.
カスタムEmptyRecyclerView
次に、このEmptyRecyclerViewをレイアウトファイルで参照します.
ここでEmptyViewはTextViewであり,当初はそのvisibilityをgoneとする.コードでsetEmptyViewを使用することを忘れないでください.
AdapterDataObserverについて
AdapterDataObserverは、RecyclerViewの抽象的な内部クラスです.
RecyclerViewは、AdapterDataObservableによってすべてのAdapterObserverを管理します.RecyclerViewのデータが変化した場合は、AdapterDataObservableに通知し、登録したAdapterDataObservableにAdapterDataObservableから通知します.
EmptyRecyclerViewには、AdapterDataObserverが登録されています.onChanged,onItemRangeInserted,onItemRangeRemovedの3つの方法を書き直し、RecyclerViewのデータ構造が変化した場合、データが空かどうかをチェックし、空であればEmptyViewを表示します.
ListViewにはsetEmptyViewメソッドがあります.ListViewデータが空または0の場合、設定されたEmptyViewを表示できるので便利です.しかし、RecyclerViewにはこの方法はありません.
以下はネットで見つけた方法です.
カスタムEmptyRecyclerView
package com.xtion.switchlist.view;
import android.content.Context;
import android.support.annotation.Nullable;
import android.support.v7.widget.RecyclerView;
import android.util.AttributeSet;
import android.view.View;
/**
* setEmptyView RecyclerView
*/
public class EmptyRecyclerView extends RecyclerView {
private View emptyView;
final private AdapterDataObserver observer = new AdapterDataObserver() {
@Override
public void onChanged() {
checkIfEmpty();
}
@Override
public void onItemRangeInserted(int positionStart, int itemCount) {
checkIfEmpty();
}
@Override
public void onItemRangeRemoved(int positionStart, int itemCount) {
checkIfEmpty();
}
};
public EmptyRecyclerView(Context context) {
super(context);
}
public EmptyRecyclerView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}
public EmptyRecyclerView(Context context, @Nullable AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
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();
}
public void setEmptyView(View emptyView) {
this.emptyView = emptyView;
checkIfEmpty();
}
}
次に、このEmptyRecyclerViewをレイアウトファイルで参照します.
<com.xtion.switchlist.view.EmptyRecyclerView
android:id="@+id/orderm_list_detail"
android:scrollbars="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
"@+id/no_data"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:drawableTop="@drawable/ic_empty"
android:layout_gravity="center"
android:text=" "
android:visibility="gone"/>
ここでEmptyViewはTextViewであり,当初はそのvisibilityをgoneとする.コードでsetEmptyViewを使用することを忘れないでください.
emptyRecyclerView.setEmptyView(textView);
AdapterDataObserverについて
AdapterDataObserverは、RecyclerViewの抽象的な内部クラスです.
public static abstract class AdapterDataObserver {
public void onChanged() {
// Do nothing
}
public void onItemRangeChanged(int positionStart, int itemCount) {
// do nothing
}
public void onItemRangeChanged(int positionStart, int itemCount, Object payload) {
// fallback to onItemRangeChanged(positionStart, itemCount) if app
// does not override this method.
onItemRangeChanged(positionStart, itemCount);
}
public void onItemRangeInserted(int positionStart, int itemCount) {
// do nothing
}
public void onItemRangeRemoved(int positionStart, int itemCount) {
// do nothing
}
public void onItemRangeMoved(int fromPosition, int toPosition, int itemCount) {
// do nothing
}
}
RecyclerViewは、AdapterDataObservableによってすべてのAdapterObserverを管理します.RecyclerViewのデータが変化した場合は、AdapterDataObservableに通知し、登録したAdapterDataObservableにAdapterDataObservableから通知します.
EmptyRecyclerViewには、AdapterDataObserverが登録されています.onChanged,onItemRangeInserted,onItemRangeRemovedの3つの方法を書き直し、RecyclerViewのデータ構造が変化した場合、データが空かどうかをチェックし、空であればEmptyViewを表示します.