package nucleus.example.util.adapters; import android.support.v7.widget.RecyclerView; import android.view.ViewGroup; import java.util.Collections; import java.util.List; import static java.util.Arrays.asList; public abstract class BaseRecyclerViewAdapter extends RecyclerView.Adapter<BaseViewHolder> { private final List<ViewHolderType> types; public BaseRecyclerViewAdapter(ViewHolderType... types) { this.types = Collections.unmodifiableList(asList(types)); } protected abstract List<?> getItems(); @Override public BaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { return types.get(viewType).create(parent); } @Override public void onBindViewHolder(BaseViewHolder holder, int position) { holder.bind(getItems().get(position)); } @Override public int getItemViewType(int position) { Object item = getItems().get(position); for (int t = 0, size = types.size(); t < size; t++) { if (types.get(t).isOfItem(item)) return t; } throw new IllegalStateException("No view holder is registered for item: " + item + " at position: " + position); } @Override public int getItemCount() { return getItems().size(); } }