import net.ktnx.mobileledger.model.Data;
import net.ktnx.mobileledger.model.LedgerTransaction;
import net.ktnx.mobileledger.model.LedgerTransactionAccount;
-import net.ktnx.mobileledger.model.MobileLedgerProfile;
import net.ktnx.mobileledger.model.TransactionListItem;
+import net.ktnx.mobileledger.ui.MainModel;
import net.ktnx.mobileledger.utils.Colors;
import net.ktnx.mobileledger.utils.Globals;
+import net.ktnx.mobileledger.utils.Logger;
import net.ktnx.mobileledger.utils.Misc;
import net.ktnx.mobileledger.utils.SimpleDate;
import java.text.DateFormat;
import java.util.GregorianCalendar;
+import java.util.List;
import java.util.Locale;
import java.util.TimeZone;
public class TransactionListAdapter extends RecyclerView.Adapter<TransactionRowHolder> {
- private MobileLedgerProfile profile;
- private AsyncListDiffer<TransactionListItem> listDiffer;
- public TransactionListAdapter() {
+ private final MainModel model;
+ private final AsyncListDiffer<TransactionListItem> listDiffer;
+ public TransactionListAdapter(MainModel model) {
super();
+ this.model = model;
+
listDiffer = new AsyncListDiffer<>(this, new DiffUtil.ItemCallback<TransactionListItem>() {
@Override
public boolean areItemsTheSame(@NonNull TransactionListItem oldItem,
return oldItem.getTransaction()
.getId() == newItem.getTransaction()
.getId();
+ case HEADER:
+ return true; // there can be only one header
default:
throw new IllegalStateException(
String.format(Locale.US, "Unexpected transaction item type %s",
case TRANSACTION:
return oldItem.getTransaction()
.equals(newItem.getTransaction());
+ case HEADER:
+ // headers don't differ in their contents. they observe the last update
+ // date and react to its changes
+ return true;
default:
throw new IllegalStateException(
String.format(Locale.US, "Unexpected transaction item type %s",
});
}
public void onBindViewHolder(@NonNull TransactionRowHolder holder, int position) {
- TransactionListItem item = TransactionListViewModel.getTransactionListItem(position);
+ TransactionListItem item = listDiffer.getCurrentList()
+ .get(position);
// in a race when transaction value is reduced, but the model hasn't been notified yet
// the view will disappear when the notifications reaches the model, so by simply omitting
if (item == null)
return;
- switch (item.getType()) {
+ final TransactionListItem.Type newType = item.getType();
+ holder.setType(newType);
+
+ switch (newType) {
case TRANSACTION:
- holder.vTransaction.setVisibility(View.VISIBLE);
- holder.vDelimiter.setVisibility(View.GONE);
LedgerTransaction tr = item.getTransaction();
// debug("transactions", String.format("Filling position %d with %d
TransactionLoader loader = new TransactionLoader();
loader.executeOnExecutor(AsyncTask.THREAD_POOL_EXECUTOR,
- new TransactionLoaderParams(tr, holder, position,
- Data.accountFilter.getValue(), item.isOdd()));
+ new TransactionLoaderParams(tr, holder, position, model.getAccountFilter()
+ .getValue()));
// WORKAROUND what seems to be a bug in CardHolder somewhere
// when a view that was previously holding a delimiter is re-purposed
break;
case DELIMITER:
SimpleDate date = item.getDate();
- holder.vTransaction.setVisibility(View.GONE);
- holder.vDelimiter.setVisibility(View.VISIBLE);
holder.tvDelimiterDate.setText(DateFormat.getDateInstance()
.format(date.toDate()));
if (item.isMonthShown()) {
holder.vDelimiterThick.setVisibility(View.GONE);
}
break;
+ case HEADER:
+ holder.setLastUpdateText(Data.lastTransactionsUpdateText.get());
+
+ break;
+ default:
+ throw new IllegalStateException("Unexpected value: " + newType);
}
}
-
@NonNull
@Override
public TransactionRowHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
@Override
public int getItemCount() {
- return Data.transactions.size();
+ return listDiffer.getCurrentList()
+ .size();
+ }
+ public void setTransactions(List<TransactionListItem> newList) {
+ Logger.debug("transactions",
+ String.format(Locale.US, "Got new transaction list (%d items)", newList.size()));
+ listDiffer.submitList(newList);
}
enum LoaderStep {HEAD, ACCOUNTS, DONE}
@Override
protected Void doInBackground(TransactionLoaderParams... p) {
LedgerTransaction tr = p[0].transaction;
- boolean odd = p[0].odd;
SQLiteDatabase db = App.getDatabase();
tr.loadData(db);
- publishProgress(new TransactionLoaderStep(p[0].holder, p[0].position, tr, odd));
+ publishProgress(new TransactionLoaderStep(p[0].holder, p[0].position, tr));
int rowIndex = 0;
// FIXME ConcurrentModificationException in ArrayList$ltr.next (ArrayList.java:831)
if (row == null) {
row = new LinearLayout(ctx);
LayoutInflater inflater = ((Activity) ctx).getLayoutInflater();
- inflater.inflate(
- R.layout.transaction_list_row_accounts_table_row, row);
+ inflater.inflate(R.layout.transaction_list_row_accounts_table_row, row);
holder.tableAccounts.addView(row);
}
TextView dummyText = row.findViewById(R.id.dummy_text);
}
private static class TransactionLoaderParams {
- LedgerTransaction transaction;
- TransactionRowHolder holder;
- int position;
- String boldAccountName;
- boolean odd;
+ final LedgerTransaction transaction;
+ final TransactionRowHolder holder;
+ final int position;
+ final String boldAccountName;
TransactionLoaderParams(LedgerTransaction transaction, TransactionRowHolder holder,
- int position, String boldAccountName, boolean odd) {
+ int position, String boldAccountName) {
this.transaction = transaction;
this.holder = holder;
this.position = position;
this.boldAccountName = boldAccountName;
- this.odd = odd;
}
}
}
\ No newline at end of file