]> git.ktnx.net Git - mobile-ledger.git/blobdiff - app/src/main/java/net/ktnx/mobileledger/ui/new_transaction/NewTransactionItemsAdapter.java
more pronounced day/month delimiters in the transaction list
[mobile-ledger.git] / app / src / main / java / net / ktnx / mobileledger / ui / new_transaction / NewTransactionItemsAdapter.java
index b1844c8ec182eda8b1a07f8089d4fd71a5fed751..b6b17beaf827add2bbab416da70301dd643e0553 100644 (file)
@@ -26,15 +26,18 @@ import androidx.recyclerview.widget.DiffUtil;
 import androidx.recyclerview.widget.ItemTouchHelper;
 import androidx.recyclerview.widget.RecyclerView;
 
-import net.ktnx.mobileledger.databinding.NewTransactionRowBinding;
-import net.ktnx.mobileledger.model.MobileLedgerProfile;
+import net.ktnx.mobileledger.databinding.NewTransactionAccountRowBinding;
+import net.ktnx.mobileledger.databinding.NewTransactionHeaderRowBinding;
+import net.ktnx.mobileledger.db.Profile;
 import net.ktnx.mobileledger.utils.Logger;
 
 import java.util.List;
 import java.util.Locale;
 import java.util.Objects;
 
-class NewTransactionItemsAdapter extends RecyclerView.Adapter<NewTransactionItemHolder> {
+class NewTransactionItemsAdapter extends RecyclerView.Adapter<NewTransactionItemViewHolder> {
+    private static final int ITEM_VIEW_TYPE_HEADER = 1;
+    private static final int ITEM_VIEW_TYPE_ACCOUNT = 2;
     final NewTransactionModel model;
     private final ItemTouchHelper touchHelper;
     private final AsyncListDiffer<NewTransactionModel.Item> differ =
@@ -58,9 +61,9 @@ class NewTransactionItemsAdapter extends RecyclerView.Adapter<NewTransactionItem
                     return oldItem.equalContents(newItem);
                 }
             });
-    private MobileLedgerProfile mProfile;
+    private Profile mProfile;
     private int checkHoldCounter = 0;
-    NewTransactionItemsAdapter(NewTransactionModel viewModel, MobileLedgerProfile profile) {
+    NewTransactionItemsAdapter(NewTransactionModel viewModel, Profile profile) {
         super();
         setHasStableIds(true);
         model = viewModel;
@@ -78,7 +81,7 @@ class NewTransactionItemsAdapter extends RecyclerView.Adapter<NewTransactionItem
             public boolean canDropOver(@NonNull RecyclerView recyclerView,
                                        @NonNull RecyclerView.ViewHolder current,
                                        @NonNull RecyclerView.ViewHolder target) {
-                final int adapterPosition = target.getAdapterPosition();
+                final int adapterPosition = target.getBindingAdapterPosition();
 
                 // first item is immovable
                 if (adapterPosition == 0)
@@ -91,7 +94,7 @@ class NewTransactionItemsAdapter extends RecyclerView.Adapter<NewTransactionItem
                                         @NonNull RecyclerView.ViewHolder viewHolder) {
                 int flags = makeFlag(ItemTouchHelper.ACTION_STATE_IDLE, ItemTouchHelper.END);
                 // the top (date and description) and the bottom (padding) items are always there
-                final int adapterPosition = viewHolder.getAdapterPosition();
+                final int adapterPosition = viewHolder.getBindingAdapterPosition();
                 if (adapterPosition > 0) {
                     flags |= makeFlag(ItemTouchHelper.ACTION_STATE_DRAG,
                             ItemTouchHelper.UP | ItemTouchHelper.DOWN) |
@@ -106,39 +109,69 @@ class NewTransactionItemsAdapter extends RecyclerView.Adapter<NewTransactionItem
                                   @NonNull RecyclerView.ViewHolder viewHolder,
                                   @NonNull RecyclerView.ViewHolder target) {
 
-                model.moveItem(viewHolder.getAdapterPosition(), target.getAdapterPosition());
+                model.moveItem(viewHolder.getBindingAdapterPosition(),
+                        target.getBindingAdapterPosition());
                 return true;
             }
             @Override
             public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
-                int pos = viewHolder.getAdapterPosition();
+                int pos = viewHolder.getBindingAdapterPosition();
                 viewModel.removeItem(pos);
             }
         });
     }
     @Override
+    public int getItemViewType(int position) {
+        final ItemType type = differ.getCurrentList()
+                                    .get(position)
+                                    .getType();
+        switch (type) {
+            case generalData:
+                return ITEM_VIEW_TYPE_HEADER;
+            case transactionRow:
+                return ITEM_VIEW_TYPE_ACCOUNT;
+            default:
+                throw new RuntimeException("Can't handle " + type);
+        }
+    }
+    @Override
     public long getItemId(int position) {
         return differ.getCurrentList()
                      .get(position)
                      .getId();
     }
-    public void setProfile(MobileLedgerProfile profile) {
+    public void setProfile(Profile profile) {
         mProfile = profile;
     }
     @NonNull
     @Override
-    public NewTransactionItemHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
-        NewTransactionRowBinding b =
-                NewTransactionRowBinding.inflate(LayoutInflater.from(parent.getContext()), parent,
-                        false);
-
-        final NewTransactionItemHolder newHolder = new NewTransactionItemHolder(b, this);
-        Logger.debug("new-trans",
-                "Creating new ViewHolder " + Integer.toHexString(newHolder.hashCode()));
-        return newHolder;
+    public NewTransactionItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent,
+                                                           int viewType) {
+        switch (viewType) {
+            case ITEM_VIEW_TYPE_HEADER:
+                NewTransactionHeaderRowBinding headerBinding =
+                        NewTransactionHeaderRowBinding.inflate(
+                                LayoutInflater.from(parent.getContext()), parent, false);
+                final NewTransactionHeaderItemHolder headerHolder =
+                        new NewTransactionHeaderItemHolder(headerBinding, this);
+                Logger.debug("new-trans", "Creating new Header ViewHolder " +
+                                          Integer.toHexString(headerHolder.hashCode()));
+                return headerHolder;
+            case ITEM_VIEW_TYPE_ACCOUNT:
+                NewTransactionAccountRowBinding accBinding =
+                        NewTransactionAccountRowBinding.inflate(
+                                LayoutInflater.from(parent.getContext()), parent, false);
+                final NewTransactionAccountRowItemHolder accHolder =
+                        new NewTransactionAccountRowItemHolder(accBinding, this);
+                Logger.debug("new-trans", "Creating new AccountRow ViewHolder " +
+                                          Integer.toHexString(accHolder.hashCode()));
+                return accHolder;
+            default:
+                throw new RuntimeException("Cant handle view type " + viewType);
+        }
     }
     @Override
-    public void onBindViewHolder(@NonNull NewTransactionItemHolder holder, int position) {
+    public void onBindViewHolder(@NonNull NewTransactionItemViewHolder holder, int position) {
         Logger.debug("bind",
                 String.format(Locale.US, "Binding item at position %d, holder %s", position,
                         Integer.toHexString(holder.hashCode())));
@@ -195,4 +228,8 @@ class NewTransactionItemsAdapter extends RecyclerView.Adapter<NewTransactionItem
         Logger.debug("new-trans", "adapter: submitting new item list");
         differ.submitList(newList);
     }
+    public NewTransactionModel.Item getItem(int position) {
+        return differ.getCurrentList()
+                     .get(position);
+    }
 }