]> git.ktnx.net Git - mobile-ledger.git/blobdiff - app/src/main/java/net/ktnx/mobileledger/ui/templates/TemplatesRecyclerViewAdapter.java
add divider before fallback templates
[mobile-ledger.git] / app / src / main / java / net / ktnx / mobileledger / ui / templates / TemplatesRecyclerViewAdapter.java
index 6c1632ea5ccddc89a9a96b45374968da9d703ede..320adc576589f542a9c9c20b0d2c677504a9b229 100644 (file)
@@ -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<TemplateViewHolder> {
-    private final AsyncListDiffer<TemplateHeader> listDiffer;
+public class TemplatesRecyclerViewAdapter extends RecyclerView.Adapter<BaseTemplateViewHolder> {
+    private static final int ITEM_TYPE_TEMPLATE = 1;
+    private static final int ITEM_TYPE_DIVIDER = 2;
+    private final AsyncListDiffer<BaseTemplateItem> listDiffer;
+
     public TemplatesRecyclerViewAdapter() {
-        listDiffer = new AsyncListDiffer<>(this, new DiffUtil.ItemCallback<TemplateHeader>() {
+        listDiffer = new AsyncListDiffer<>(this, new DiffUtil.ItemCallback<BaseTemplateItem>() {
             @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<TemplateHeader> newList) {
-        listDiffer.submitList(newList);
+        List<BaseTemplateItem> 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;
+        }
     }
 }