X-Git-Url: https://git.ktnx.net/?p=mobile-ledger.git;a=blobdiff_plain;f=app%2Fsrc%2Fmain%2Fjava%2Fnet%2Fktnx%2Fmobileledger%2Fui%2Ftemplates%2FTemplatesRecyclerViewAdapter.java;h=320adc576589f542a9c9c20b0d2c677504a9b229;hp=6c1632ea5ccddc89a9a96b45374968da9d703ede;hb=fb2d072ef47f806238968a9bc73fc7972d1c6bbc;hpb=92846565ae94144ea1423be61c37e5a7b1a920fa diff --git a/app/src/main/java/net/ktnx/mobileledger/ui/templates/TemplatesRecyclerViewAdapter.java b/app/src/main/java/net/ktnx/mobileledger/ui/templates/TemplatesRecyclerViewAdapter.java index 6c1632ea..320adc57 100644 --- a/app/src/main/java/net/ktnx/mobileledger/ui/templates/TemplatesRecyclerViewAdapter.java +++ b/app/src/main/java/net/ktnx/mobileledger/ui/templates/TemplatesRecyclerViewAdapter.java @@ -26,49 +26,118 @@ import androidx.recyclerview.widget.DiffUtil; import androidx.recyclerview.widget.RecyclerView; import net.ktnx.mobileledger.databinding.TemplateListTemplateItemBinding; +import net.ktnx.mobileledger.databinding.TemplatesFallbackDividerBinding; import net.ktnx.mobileledger.db.TemplateHeader; import org.jetbrains.annotations.NotNull; +import java.util.ArrayList; import java.util.List; -public class TemplatesRecyclerViewAdapter extends RecyclerView.Adapter { - private final AsyncListDiffer listDiffer; +public class TemplatesRecyclerViewAdapter extends RecyclerView.Adapter { + private static final int ITEM_TYPE_TEMPLATE = 1; + private static final int ITEM_TYPE_DIVIDER = 2; + private final AsyncListDiffer listDiffer; + public TemplatesRecyclerViewAdapter() { - listDiffer = new AsyncListDiffer<>(this, new DiffUtil.ItemCallback() { + listDiffer = new AsyncListDiffer<>(this, new DiffUtil.ItemCallback() { @Override - public boolean areItemsTheSame(@NotNull TemplateHeader oldItem, - @NotNull TemplateHeader newItem) { - return oldItem.getId() - .equals(newItem.getId()); + public boolean areItemsTheSame( + @NotNull TemplatesRecyclerViewAdapter.BaseTemplateItem oldItem, + @NotNull TemplatesRecyclerViewAdapter.BaseTemplateItem newItem) { + return oldItem.getId() == newItem.getId(); } @Override - public boolean areContentsTheSame(@NotNull TemplateHeader oldItem, - @NotNull TemplateHeader newItem) { + public boolean areContentsTheSame( + @NotNull TemplatesRecyclerViewAdapter.BaseTemplateItem oldItem, + @NotNull TemplatesRecyclerViewAdapter.BaseTemplateItem newItem) { return oldItem.equals(newItem); } }); } @NonNull @Override - public TemplateViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { - TemplateListTemplateItemBinding b = - TemplateListTemplateItemBinding.inflate(LayoutInflater.from(parent.getContext()), - parent, false); - - return new TemplateViewHolder(b); + public BaseTemplateViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { + final LayoutInflater inflater = LayoutInflater.from(parent.getContext()); + switch (viewType) { + case ITEM_TYPE_TEMPLATE: + TemplateListTemplateItemBinding b = + TemplateListTemplateItemBinding.inflate(inflater, parent, false); + return new BaseTemplateViewHolder.TemplateViewHolder(b); + case ITEM_TYPE_DIVIDER: + return new BaseTemplateViewHolder.TemplateDividerViewHolder( + TemplatesFallbackDividerBinding.inflate(inflater, parent, false)); + default: + throw new RuntimeException("Can't handle " + viewType); + } } @Override - public void onBindViewHolder(@NonNull TemplateViewHolder holder, int position) { + public void onBindViewHolder(@NonNull BaseTemplateViewHolder holder, int position) { holder.bindToItem(listDiffer.getCurrentList() .get(position)); } @Override + public int getItemViewType(int position) { + BaseTemplateItem item = getItem(position); + if (item instanceof TemplateItem) + return ITEM_TYPE_TEMPLATE; + if (item instanceof TemplateDivider) + return ITEM_TYPE_DIVIDER; + + throw new RuntimeException("Can't handle " + item); + } + @Override public int getItemCount() { return listDiffer.getCurrentList() .size(); } public void setTemplates(List newList) { - listDiffer.submitList(newList); + List itemList = new ArrayList<>(); + + boolean reachedFallbackItems = false; + + for (TemplateHeader item : newList) { + if (!reachedFallbackItems && item.isFallback()) { + itemList.add(new TemplateDivider()); + reachedFallbackItems = true; + } + itemList.add(new TemplateItem(item)); + } + + listDiffer.submitList(itemList); + } + public BaseTemplateItem getItem(int position) { + return listDiffer.getCurrentList() + .get(position); + } + + static abstract class BaseTemplateItem { + abstract long getId(); + + abstract boolean equals(BaseTemplateItem other); + } + + static class TemplateItem extends BaseTemplateItem { + final TemplateHeader template; + TemplateItem(TemplateHeader template) {this.template = template;} + @Override + long getId() { + return template.getId(); + } + @Override + boolean equals(BaseTemplateItem other) { + return template.equals(((TemplateItem) other).template); + } + } + + static class TemplateDivider extends BaseTemplateItem { + @Override + long getId() { + return -1; + } + @Override + boolean equals(BaseTemplateItem other) { + return true; + } } }