Last active
December 27, 2016 02:11
-
-
Save NomenSvyat/cd45151040f1e06cfdb95c11d8df5617 to your computer and use it in GitHub Desktop.
Wrapper for adapter to show any view instead of empty list
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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