]> git.ktnx.net Git - mobile-ledger.git/blobdiff - app/src/main/java/net/ktnx/mobileledger/TransactionListAdapter.java
fu: single transaction list
[mobile-ledger.git] / app / src / main / java / net / ktnx / mobileledger / TransactionListAdapter.java
index 4b8a87084fbd7eddfa6035ff57e092f235ee9b44..7fa85d3a6c98b277350126403798588e985833bd 100644 (file)
 package net.ktnx.mobileledger;
 
 import android.content.Context;
-import android.content.res.Resources;
-import android.os.Build;
+import android.database.sqlite.SQLiteDatabase;
 import android.support.annotation.NonNull;
+import android.support.constraint.ConstraintLayout;
+import android.support.v7.widget.AppCompatTextView;
 import android.support.v7.widget.RecyclerView;
+import android.util.Log;
+import android.view.Gravity;
 import android.view.LayoutInflater;
 import android.view.View;
 import android.view.ViewGroup;
 import android.widget.LinearLayout;
-import android.widget.TableLayout;
 import android.widget.TextView;
 
 import net.ktnx.mobileledger.model.LedgerTransaction;
+import net.ktnx.mobileledger.model.LedgerTransactionAccount;
+import net.ktnx.mobileledger.ui.transaction_list.TransactionListViewModel;
+import net.ktnx.mobileledger.utils.Globals;
+import net.ktnx.mobileledger.utils.MLDB;
 
-import java.util.List;
+import static net.ktnx.mobileledger.utils.DimensionUtils.dp2px;
 
 class TransactionListAdapter
         extends RecyclerView.Adapter<TransactionListAdapter.TransactionRowHolder> {
-    private List<LedgerTransaction> transactions;
-
-    TransactionListAdapter(List<LedgerTransaction> transactions) {
-        this.transactions = transactions;
+    TransactionListViewModel model;
+    public TransactionListAdapter(TransactionListViewModel model) {
+        this.model = model;
     }
-
     public void onBindViewHolder(@NonNull TransactionRowHolder holder, int position) {
-        LedgerTransaction tr = transactions.get(position);
+        LedgerTransaction tr = model.getTransaction(position);
+        // in a race when transaction list is reduced, but the model hasn't been notified yet
+        // the view will disappear when the notifications reaches the model, so by simply omitting
+        // the out-of-range get() call nothing bad happens - just a to-be-deleted view remains
+        // a bit longer
+        if (tr == null) return;
+
         Context ctx = holder.row.getContext();
-        Resources rm = ctx.getResources();
 
-        holder.tvDescription.setText(String.format("%s\n%s", tr.getDescription(), tr.getDate()));
-        TableLayout tbl = holder.row.findViewById(R.id.transaction_row_acc_amounts);
-        tbl.removeAllViews();
-        for (Iterator<LedgerTransactionItem> it = tr.getItemsIterator(); it.hasNext(); ) {
-            LedgerTransactionItem acc = it.next();
-            TableRow row = new TableRow(holder.row.getContext());
-            TextView child = new TextView(ctx);
-            child.setText(acc.getShortAccountName());
-            row.addView(child);
-            child = new TextView(ctx);
-            child.setText(acc.toString());
-            row.addView(child);
-            tbl.addView(row);
-        }
+        try (SQLiteDatabase db = MLDB.getReadableDatabase(ctx)) {
+            tr.loadData(db);
+            holder.tvDescription.setText(tr.getDescription());
+            holder.tvDate.setText(tr.getDate());
 
-        if (position % 2 == 0) {
-            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) holder.row
-                    .setBackgroundColor(rm.getColor(R.color.table_row_even_bg, ctx.getTheme()));
-            else holder.row.setBackgroundColor(rm.getColor(R.color.table_row_even_bg));
-        }
-        else {
-            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) holder.row
-                    .setBackgroundColor(rm.getColor(R.color.drawer_background, ctx.getTheme()));
-            else holder.row.setBackgroundColor(rm.getColor(R.color.drawer_background));
-        }
+            int rowIndex = 0;
+            for (LedgerTransactionAccount acc : tr.getAccounts()) {
+                LinearLayout row = (LinearLayout) holder.tableAccounts.getChildAt(rowIndex++);
+                TextView accName, accAmount;
+                if (row == null) {
+                    row = new LinearLayout(ctx);
+                    row.setLayoutParams(
+                            new LinearLayout.LayoutParams(LinearLayout.LayoutParams.MATCH_PARENT,
+                                    LinearLayout.LayoutParams.WRAP_CONTENT));
+                    row.setGravity(Gravity.CENTER_VERTICAL);
+                    row.setOrientation(LinearLayout.HORIZONTAL);
+                    row.setPaddingRelative(dp2px(ctx, 8), 0, 0, 0);
+                    accName = new AppCompatTextView(ctx);
+                    accName.setLayoutParams(new LinearLayout.LayoutParams(0,
+                                    LinearLayout.LayoutParams.WRAP_CONTENT, 5f));
+                    accName.setTextAlignment(View.TEXT_ALIGNMENT_VIEW_START);
+                    row.addView(accName);
+                    accAmount = new AppCompatTextView(ctx);
+                    LinearLayout.LayoutParams llp =
+                            new LinearLayout.LayoutParams(LinearLayout.LayoutParams.WRAP_CONTENT,
+                                    LinearLayout.LayoutParams.WRAP_CONTENT);
+                    llp.setMarginEnd(0);
+                    accAmount.setLayoutParams(llp);
+                    accAmount.setTextAlignment(View.TEXT_ALIGNMENT_VIEW_END);
+                    accAmount.setMinWidth(dp2px(ctx, 60));
+                    row.addView(accAmount);
+                    holder.tableAccounts.addView(row);
+                }
+                else {
+                    accName = (TextView) row.getChildAt(0);
+                    accAmount = (TextView) row.getChildAt(1);
+                }
+                accName.setText(acc.getAccountName());
+                accAmount.setText(acc.toString());
+            }
+            if (holder.tableAccounts.getChildCount() > rowIndex) {
+                holder.tableAccounts
+                        .removeViews(rowIndex, holder.tableAccounts.getChildCount() - rowIndex);
+            }
 
-        holder.row.setTag(R.id.POS, position);
+            if (position % 2 == 0) {
+                holder.row.setBackgroundColor(Globals.table_row_even_bg);
+            }
+            else {
+                holder.row.setBackgroundColor(Globals.table_row_odd_bg);
+            }
+
+            Log.d("transactions", String.format("Filled position %d", position));
+        }
     }
 
     @NonNull
     @Override
     public TransactionRowHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
+        Log.d("perf", "onCreateViewHolder called");
         View row = LayoutInflater.from(parent.getContext())
                 .inflate(R.layout.transaction_list_row, parent, false);
         return new TransactionRowHolder(row);
     }
 
     @Override
-    public int getItemCount() {
-        return transactions.size();
+    public int getItemCount()
+    {
+        return model.getTransactionCount();
     }
     class TransactionRowHolder extends RecyclerView.ViewHolder {
-        TextView tvDescription;
-        TableLayout tableAccounts;
-        LinearLayout row;
+        TextView tvDescription, tvDate;
+        LinearLayout tableAccounts;
+        ConstraintLayout row;
         public TransactionRowHolder(@NonNull View itemView) {
             super(itemView);
-            this.row = (LinearLayout) itemView;
+            this.row = itemView.findViewById(R.id.transaction_row);
             this.tvDescription = itemView.findViewById(R.id.transaction_row_description);
+            this.tvDate = itemView.findViewById(R.id.transaction_row_date);
             this.tableAccounts = itemView.findViewById(R.id.transaction_row_acc_amounts);
         }
     }