'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.

enter image description here

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