Skip to content

Instantly share code, notes, and snippets.

@NomenSvyat
Last active December 27, 2016 02:11
Show Gist options
  • Save NomenSvyat/cd45151040f1e06cfdb95c11d8df5617 to your computer and use it in GitHub Desktop.
Save NomenSvyat/cd45151040f1e06cfdb95c11d8df5617 to your computer and use it in GitHub Desktop.
Wrapper for adapter to show any view instead of empty list
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import java.util.List;
public final class NonEmptyRecyclerViewAdapterWrapper
extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private static final int PLACEHOLDER_VIEW_TYPE = Integer.MAX_VALUE - 117;
@NonNull
private final ViewProvider viewProvider;
@NonNull
private RecyclerView.Adapter adapter;
private boolean adapterIsEmpty;
private NonEmptyRecyclerViewAdapterWrapper(@NonNull RecyclerView.Adapter<? extends RecyclerView.ViewHolder> adapter,
@NonNull ViewProvider viewProvider) {
this.adapter = adapter;
this.viewProvider = viewProvider;
forwardAdapterDataObserver();
}
private void forwardAdapterDataObserver() {
this.adapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() {
@Override
public void onChanged() {
NonEmptyRecyclerViewAdapterWrapper.this.adapter.unregisterAdapterDataObserver(this);
notifyDataSetChanged();
NonEmptyRecyclerViewAdapterWrapper.this.adapter.registerAdapterDataObserver(this);
}
});
}
public static RecyclerView.Adapter wrap(@NonNull RecyclerView.Adapter<? extends RecyclerView.ViewHolder> adapter,
int layoutRes) {
return new NonEmptyRecyclerViewAdapterWrapper(adapter, new ViewProvider() {
@Override
public View getView(@NonNull ViewGroup parent) {
return LayoutInflater.from(parent.getContext())
.inflate(layoutRes, parent, false);
}
});
}
public static RecyclerView.Adapter wrap(@NonNull RecyclerView.Adapter<? extends RecyclerView.ViewHolder> adapter,
View view) {
return new NonEmptyRecyclerViewAdapterWrapper(adapter, new ViewProvider() {
@Override
public View getView(@NonNull ViewGroup parent) {
return view;
}
});
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (adapterIsEmpty && viewType == PLACEHOLDER_VIEW_TYPE) {
return new RecyclerView.ViewHolder(viewProvider.getView(parent)) {
};
}
return adapter.onCreateViewHolder(parent, viewType);
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
if (!adapterIsEmpty) {
//noinspection unchecked
adapter.onBindViewHolder(holder, position);
}
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder,
int position,
List<Object> payloads) {
if (!adapterIsEmpty) {
//noinspection unchecked
adapter.onBindViewHolder(holder, position, payloads);
}
}
@Override
public int getItemViewType(int position) {
return adapterIsEmpty ? PLACEHOLDER_VIEW_TYPE : adapter.getItemViewType(position);
}
@Override
public void setHasStableIds(boolean hasStableIds) {
adapter.setHasStableIds(hasStableIds);
}
@Override
public long getItemId(int position) {
return adapterIsEmpty ? RecyclerView.NO_ID : adapter.getItemId(position);
}
@Override
public int getItemCount() {
int adapterItemCount = adapter.getItemCount();
if (adapterItemCount == 0) {
adapterIsEmpty = true;
return 1;
}
adapterIsEmpty = false;
return adapterItemCount;
}
@Override
public void onViewRecycled(RecyclerView.ViewHolder holder) {
//noinspection unchecked
adapter.onViewRecycled(holder);
}
@Override
public boolean onFailedToRecycleView(RecyclerView.ViewHolder holder) {
//noinspection unchecked
return adapter.onFailedToRecycleView(holder);
}
@Override
public void onViewAttachedToWindow(RecyclerView.ViewHolder holder) {
//noinspection unchecked
adapter.onViewAttachedToWindow(holder);
}
@Override
public void onViewDetachedFromWindow(RecyclerView.ViewHolder holder) {
//noinspection unchecked
adapter.onViewDetachedFromWindow(holder);
}
@Override
public void registerAdapterDataObserver(RecyclerView.AdapterDataObserver observer) {
adapter.registerAdapterDataObserver(observer);
}
@Override
public void unregisterAdapterDataObserver(RecyclerView.AdapterDataObserver observer) {
adapter.unregisterAdapterDataObserver(observer);
}
@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
adapter.onAttachedToRecyclerView(recyclerView);
}
@Override
public void onDetachedFromRecyclerView(RecyclerView recyclerView) {
adapter.onDetachedFromRecyclerView(recyclerView);
}
private interface ViewProvider {
View getView(@NonNull ViewGroup parent);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment