onAddViewHolder(RecyclerView.ViewHolder holder, int position), onCreateViewHolder(ViewGroup parent), itemCount()
onAddViewHolder(RecyclerView.ViewHolder holder, int position),onCreateViewHolder(ViewGroup parent),itemCount()
Find centralized, trusted content and collaborate around the technologies you use most.
Learn more about CollectivesStack Internal
Knowledge at work
Bring the best of human thought and AI automation together at your work.
Explore Stack InternalonAddViewHolder(RecyclerView.ViewHolder holder, int position), onCreateViewHolder(ViewGroup parent), itemCount()
onAddViewHolder(RecyclerView.ViewHolder holder, int position),onCreateViewHolder(ViewGroup parent),itemCount()onAddViewHolder(RecyclerView.ViewHolder holder, int position), onCreateViewHolder(ViewGroup parent), itemCount()
onAddViewHolder(RecyclerView.ViewHolder holder, int position),onCreateViewHolder(ViewGroup parent),itemCount()I made an implementation based on @hister's one for my personal purposes, but using inheritance.
I hide the implementation details mechanisms (like add 1 to itemCount, subtract 1 from position) in an abstract super class HeadingableRecycleAdapter, by implementing required methods from Adapter like onBindViewHolder, getItemViewType and getItemCount, making that methods final, and providing new methods with hidden logic to client:
onAddViewHolder(RecyclerView.ViewHolder holder, int position), onCreateViewHolder(ViewGroup parent), itemCount()
Here are the HeadingableRecycleAdapter class and a client. I left the header layout a bit hard-coded because it fits my needs.
public abstract class HeadingableRecycleAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { private static final int HEADER_VIEW_TYPE = 0; @LayoutRes private int headerLayoutResource; private String headerTitle; private Context context; public HeadingableRecycleAdapter(@LayoutRes int headerLayoutResourceId, String headerTitle, Context context) { this.headerLayoutResource = headerLayoutResourceId; this.headerTitle = headerTitle; this.context = context; } public Context context() { return context; } @Override public final RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { if (viewType == HEADER_VIEW_TYPE) { return new HeaderViewHolder(LayoutInflater.from(context).inflate(headerLayoutResource, parent, false)); } return onCreateViewHolder(parent); } @Override public final void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { int viewType = getItemViewType(position); if (viewType == HEADER_VIEW_TYPE) { HeaderViewHolder vh = (HeaderViewHolder) holder; vh.bind(headerTitle); } else { onAddViewHolder(holder, position - 1); } } @Override public final int getItemViewType(int position) { return position == 0 ? 0 : 1; } @Override public final int getItemCount() { return itemCount() + 1; } public abstract int itemCount(); public abstract RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent); public abstract void onAddViewHolder(RecyclerView.ViewHolder holder, int position); } @PerActivity public class IngredientsAdapter extends HeadingableRecycleAdapter { public static final String TITLE = "Ingredients"; private List<Ingredient> itemList; @Inject public IngredientsAdapter(Context context) { super(R.layout.layout_generic_recyclerview_cardified_header, TITLE, context); } public void setItemList(List<Ingredient> itemList) { this.itemList = itemList; } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent) { return new ViewHolder(LayoutInflater.from(context()).inflate(R.layout.item_ingredient, parent, false)); } @Override public void onAddViewHolder(RecyclerView.ViewHolder holder, int position) { ViewHolder vh = (ViewHolder) holder; vh.bind(itemList.get(position)); } @Override public int itemCount() { return itemList == null ? 0 : itemList.size(); } private String getQuantityFormated(double quantity, String measure) { if (quantity == (long) quantity) { return String.format(Locale.US, "%s %s", String.valueOf(quantity), measure); } else { return String.format(Locale.US, "%.1f %s", quantity, measure); } } class ViewHolder extends RecyclerView.ViewHolder { @BindView(R.id.text_ingredient) TextView txtIngredient; ViewHolder(View itemView) { super(itemView); ButterKnife.bind(this, itemView); } void bind(Ingredient ingredient) { String ingredientText = ingredient.getIngredient(); txtIngredient.setText(String.format(Locale.US, "%s %s ", getQuantityFormated(ingredient.getQuantity(), ingredient.getMeasure()), Character.toUpperCase(ingredientText.charAt(0)) + ingredientText .substring(1))); } } }