'Two arraylist in one recyclerview adapter
I need to show the amount and average amount spent in the same recyclerview, I am not sure how to get this done, please check below;
this is my onBindViewHolder
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
Expense expense = expenses.get(position);
Expense typicalExpense = typicalExpenses.get(position);
holder.item.setText("" + expense.getItem());
holder.category.setText("" + expense.getCategory());
holder.date.setText("" + expense.getDate());
holder.amount.setText("$ " + formatNumberCurrency(String.valueOf(expense.getAmount())));
holder.typical.setText("$ " + formatNumberCurrency(String.valueOf(typicalExpense.getTypical())));
holder.itemView.setOnLongClickListener(v -> {
// check condition
if (!isEnable) {
// when action mode is not enable
// initialize action mode
ActionMode.Callback callback = new ActionMode.Callback() {
@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
// initialize selection_menu inflater
MenuInflater menuInflater = mode.getMenuInflater();
// inflate selection_menu
menuInflater.inflate(R.menu.selection_menu, menu);
// return true
return true;
}
@Override
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
// when action mode is prepare
// set isEnable true
isEnable = true;
// create method
ClickItem(holder);
// set observer on getText method
mainViewModel.getText().observe((LifecycleOwner) activity
, s -> {
// when text change
// set text on action mode title
mode.setTitle(String.format(activity.getString(R.string.selected), s));
});
// return true
return true;
}
@SuppressLint({"NonConstantResourceId", "NotifyDataSetChanged"})
@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem menuItem) {
DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference().child("Expenses").child(Objects.requireNonNull(FirebaseAuth.getInstance().getCurrentUser()).getUid());
// when click on action mode item
// get item id
int id = menuItem.getItemId();
// use switch condition
switch (id) {
case R.id.menu_duplicate:
final Calendar c = Calendar.getInstance();
@SuppressLint("SimpleDateFormat") DateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy");
String date = dateFormat.format(c.getTime());
//get total amount in selection
int sum = 0;
for (Expense d : selectedExpenses) {
sum += d.amount;
}
//check if selectedExpenses' amounts exceed monthly limit
if ((totalMonth + sum) > 2000000000 || (totalMonth + sum) < 0) {
Toast.makeText(activity, R.string.monthly_limit, Toast.LENGTH_SHORT).show();
break;
} else {
for (Expense i : selectedExpenses) {
//creating new unique id
String newId = databaseReference.child("Expenses").push().getKey();
//setting the object with new id passed
final Expense duplicatedSet = new Expense(i.getItem(), i.getCategory(), date, newId, i.getAmount(), i.getTypical());
assert newId != null;
databaseReference.child(newId).setValue(duplicatedSet).addOnCompleteListener(task -> {
if (!task.isSuccessful()) {
Toast.makeText(activity.getApplicationContext(), activity.getString(R.string.input_error) + task.getException(), Toast.LENGTH_SHORT).show();
}
});
}
}
// finish action mode
mode.finish();
break;
case R.id.menu_delete:
for (Expense i : selectedExpenses) {
//only retrieve last item deleted
final Expense expenseBackUp = new Expense(i.getItem(), i.getCategory(), i.getDate(), i.getId(), i.getAmount(), i.getTypical());
databaseReference.child(i.getId()).removeValue().addOnCompleteListener(task -> {
if (task.isSuccessful()) {
Snackbar.make(activity.findViewById(android.R.id.content), activity.getString(R.string.deleted_alert),
Snackbar.LENGTH_LONG).setAction(R.string.undo, view1 -> databaseReference.child(i.getId()).setValue(expenseBackUp)).show();
} else {
Toast.makeText(activity.getApplicationContext(), activity.getString(R.string.input_error) + task.getException(), Toast.LENGTH_SHORT).show();
}
});
}
// finish action mode
mode.finish();
break;
case R.id.menu_select_all:
// when click on select all
// check condition
if (selectedExpenses.size() == expenses.size()) {
// when all item selected
// set isSelectall false
isSelectAll = false;
// create select array list
selectedExpenses.clear();
} else {
// when all item unselected
// set isSelectALL true
isSelectAll = true;
// clear select array list
selectedExpenses.clear();
// add value in select array list
selectedExpenses.addAll(expenses);
}
// set text on view model
mainViewModel.setText(String.valueOf(selectedExpenses.size()));
// notify adapter
notifyDataSetChanged();
break;
}
// return true
return true;
}
@SuppressLint("NotifyDataSetChanged")
@Override
public void onDestroyActionMode(ActionMode mode) {
// when action mode is destroy
// set isEnable false
isEnable = false;
// set isSelectAll false
isSelectAll = false;
// clear select array list
selectedExpenses.clear();
// notify adapter
notifyDataSetChanged();
}
};
// start action mode
((AppCompatActivity) v.getContext()).startActionMode(callback);
} else {
// when action mode is already enable
// call method
ClickItem(holder);
}
// return true
return true;
});
holder.itemView.setOnClickListener(v -> {
// check condition
if (isEnable) {
// when action mode is enable
ClickItem(holder);
} else {
// when action mode is not enable edit single item
item = expense.getItem();
category = expense.getCategory();
date = expense.getDate();
postId = expense.getId();
amount = expense.getAmount();
updateExpense();
}
});
// check condition
if (isSelectAll) {
// when value selected
// visible all check box image
holder.checkbox.setVisibility(View.VISIBLE);
} else {
// when all value unselected
// hide all check box image
holder.checkbox.setVisibility(View.GONE);
}
}
this is my code where I am testing with a constant value (90).
private void typical() {
final Calendar c = Calendar.getInstance();
DateFormat dateFormat = new SimpleDateFormat("MM");
String month = dateFormat.format(c.getTime());
dateFormat = new SimpleDateFormat("yyyy");
String year = dateFormat.format(c.getTime());
databaseReference.addValueEventListener(new ValueEventListener() {
@SuppressLint("NotifyDataSetChanged")
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
typicalExpenses.clear();
for (DataSnapshot dataSnapshot : snapshot.getChildren()) {
Expense expense = dataSnapshot.getValue(Expense.class);
assert expense != null;
if (expense.getDate().substring(3, 5).equals(month) && expense.getDate().substring(6, 10).equals(year)) {
boolean exists = false;
int count = 0;
for (int i = 0; i < typicalExpenses.size(); i++) {
count = i;
exists = typicalExpenses.get(i).getItem().equalsIgnoreCase(expense.getItem());
if (exists) break;
}
if (exists) {
typicalExpenses.get(count).setTypical(typicalExpenses.get(count).getAmount() + expense.getAmount());
} else {
typicalExpenses.add(expense);
}
}
}
expensesAdapter.notifyDataSetChanged();
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});
}
this is my recyclerview for reference.
Basically what I want to show in typical is, if same title exists in my expenses get the average and set it in the Typical Textview but my main problem is that this line is not setting anything typicalExpenses.get(count).setTypical(90);
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|

