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 =
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;
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)
@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) |
@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);
-
- return new NewTransactionItemHolder(b, this);
+ 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) {
- Logger.debug("bind", String.format(Locale.US, "Binding item at position %d", 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())));
NewTransactionModel.Item item = Objects.requireNonNull(differ.getCurrentList()
.get(position));
holder.bind(item);
Logger.debug("new-trans", "adapter: submitting new item list");
differ.submitList(newList);
}
+ public NewTransactionModel.Item getItem(int position) {
+ return differ.getCurrentList()
+ .get(position);
+ }
}