简体   繁体   English

如何将相同的值分组到 1 个 recyclerview 项目中?

[英]How can I group same values into 1 single recyclerview item?

I have a recyclerview where I list expenses' category from Firebase using JAVA, I am looking to group categories so I only get 1 recyclerview item called FOOD, ENTERTAINMENT etc, this and the total amount for every item in that category.我有一个 recyclerview,其中我使用 JAVA 列出了 Firebase 的费用类别,我希望对类别进行分组,所以我只得到 1 个名为 FOOD、ENTERTAINMENT 等的 recyclerview 项目,以及该类别中每个项目的总金额。

this is my recyclerview result now;这是我的 recyclerview 结果了;

在此处输入图像描述

this is my adapter class;这是我的适配器 class;

public class CategoriesAdapter extends RecyclerView.Adapter<CategoriesAdapter.ViewHolder> {
    private Context mContext;
    private ArrayList<Expense> categories;

    public CategoriesAdapter(Context mContext, ArrayList<Expense> categories) {
        this.mContext = mContext;
        this.categories = categories;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(mContext).inflate(R.layout.categories_retrieve_layout, parent, false);
        return new ViewHolder(view);
    }

    @SuppressLint("SetTextI18n")
    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
        final Expense expense = categories.get(position);

        holder.category.setText("" + expense.getCategory());
        holder.amount.setText("$ " + formatNumberCurrency(String.valueOf(expense.getAmount())));

    }

    @Override
    public int getItemCount() {
        return categories.size();
    }

    public class ViewHolder extends RecyclerView.ViewHolder {

        private TextView category;
        private TextView amount;
        private TextView percentage;

        public ViewHolder(@NonNull View itemView) {
            super(itemView);

            category = itemView.findViewById(R.id.category_name);
            amount = itemView.findViewById(R.id.category_total_amount);
            percentage = itemView.findViewById(R.id.percentage_indicator);

        }
    }

    private static String formatNumberCurrency(String amount) {
        DecimalFormat formatter = new DecimalFormat("###,###,###");
        return formatter.format(Double.parseDouble(amount));
    }
}

and here is how I am reading my data这是我读取数据的方式

final Calendar c = Calendar.getInstance();
@SuppressLint("SimpleDateFormat") DateFormat dateFormat = new SimpleDateFormat("dd-MM-yyyy");
String date = dateFormat.format(c.getTime());

DatabaseReference databaseReference = FirebaseDatabase.getInstance().getReference().child("Expenses").child(Objects.requireNonNull(mAuth.getCurrentUser()).getUid());
Query query = databaseReference.orderByChild("date").equalTo(date);
query.addValueEventListener(new ValueEventListener() {
    @SuppressLint("NotifyDataSetChanged")
    @Override
    public void onDataChange(@NonNull DataSnapshot snapshot) {
        expenses.clear();

        for (DataSnapshot dataSnapshot : snapshot.getChildren()) {
            Expense expense = dataSnapshot.getValue(Expense.class);
            expenses.add(expense);
        }

        categoriesAdapter.notifyDataSetChanged();

    }

    @Override
    public void onCancelled(@NonNull DatabaseError error) {

    }
});

Here, the output I am expecting to get在这里,我希望得到的 output

在此处输入图像描述

any advice on how to create the logic for this?关于如何为此创建逻辑的任何建议?


This is the error I got while trying to use Sambhav.这是我在尝试使用 Sambhav 时遇到的错误。 K's answer: K 的回答:

在此处输入图像描述

You can check if a value already exists or not when adding it to the list.您可以在将值添加到列表时检查它是否已经存在。 Try this:尝试这个:

query.addValueEventListener(new ValueEventListener() {
    @SuppressLint("NotifyDataSetChanged")
    @Override
    public void onDataChange(@NonNull DataSnapshot snapshot) {
        expenses.clear();

        for (DataSnapshot dataSnapshot : snapshot.getChildren()) {
            Expense expense = dataSnapshot.getValue(Expense.class);
            boolean exists = false;
            int count = 0;
            for(int i = 0; i < expenses.size(); i++){
               count = i;
               exists = expenses.get(i).getCategory().equalsIgnoreCase(expense.getCategory());
               if(exists) break;
            }
            if(exists){
               expenses.get(count).setAmount(expenses.get(i).getAmount()() + expense.getAmount());
            }else{
               expenses.add(expense);
            }
        }

        categoriesAdapter.notifyDataSetChanged();

    }

    @Override
    public void onCancelled(@NonNull DatabaseError error) {
       error.printStackTrace();
    }
});

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何在 recyclerview 上显示 slider? - How can i show the slider on recyclerview? 如何将recyclerview中的所有数据传递给另一个活动并在listview或recyclerview中显示它 Firebase - How can I pass all the data in the recyclerview to another activity and show it in the listview or recyclerview Firebase 如何删除 gitlab 中的组? - How can I delete group in gitlab? SQL - GROUP BY 同一列的 3 个值 - SQL - GROUP BY 3 values of the same column 如何使用 JSON.net 处理同一属性的单个项目和数组 - How to handle both a single item and an array for the same property using JSON.net 从适配器 class 中删除项目时如何更新 recyclerview - how to update recyclerview when delete an item from adapter class 如何在 recyclerview 上使用 onSwipe 从实时数据库中删除条目 - How Can I delete an entry from realtime database using onSwipe on a recyclerview 我可以在一个 firebase 数据库上使用多个应用程序吗? 它会使用相同的身份验证还是不同的身份验证? - Can i use multiple apps on a single firebase database? Will it use same auth or different auth? 如何使用 firebase childEventListener 更新平滑 animation 添加的 Recyclerview 新项目? - How to update Recyclerview new item added with smooth animation with firebase childEventListener? 如何替换 AWS Auto Scaling 组中的特定实例? - How can I replace a specific instance in an AWS Auto Scaling Group?
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM