首页 > 解决方案 > 如何避免listview firebase中的重复数据

问题描述

我知道这个问题已经被问过了,我跟着这个问题

我的 Firebase 结构。

在此处输入图像描述

我需要在列表视图中显示费用名称。如果数据重复多次,它应该只在listview中显示一次数据,没有数据重复,如果firebase中没有重复数据,它也应该在listview中可见。

我已经尝试使用下面的代码来消除重复数据,但它不适用于在 firebase 中不重复的数据。

例如在我的火力基地

oil // repeated 2 times
petrol //repeated 1 time

我需要输出为

oil
petrol

但实际得到的输出是

oil

主要活动

 listfirebaseref=FirebaseDatabase.getInstance().getReference("Expenses Details").child(username).child(monthYr);

listfirebaseref.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            expenseClassList.clear();
            int sum = 0;
            ExpenseClass expenseClass;
            Log.d("Tag", "on list Adpter");
            for (DataSnapshot ds : dataSnapshot.getChildren()) {
                for (DataSnapshot data : ds.getChildren()) {
                    String exp = data.child("expensesName").getValue(String.class);
                    spacecraft = new ExpensesName(exp);
                    expenseClassList.add(spacecraft);
                    Log.d("Tag", " " + expenseClassList);
                    }
                    }
                    for (int i = 0; i < expenseClassList.size(); i++) {
                        for (int j = 0; j < expenseClassList.size(); j++) {
                            if ((expenseClassList.get(i).equals(expenseClassList.get(j)))) {
                                expenseClassList.remove(j);
                                //j;
                            }
                            }
                            }
                            Log.d("Tag", " list Adpter");
                            adapter.notifyDataSetChanged();
        }



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

        }
    });

标签: androidfirebaselistviewfirebase-realtime-database

解决方案


为什么不使用 HashSet 而不是 ArrayList?

顺便说一句,你没有得到这很奇怪concurrent modification exception。迭代时不能从列表中删除。关联

Set<ExpensesName> expenseClassList = new HashSet<>();

   ....

   for (DataSnapshot ds : dataSnapshot.getChildren()) {
                for (DataSnapshot data : ds.getChildren()) { 
                  String exp = data.child("expensesName").getValue(String.class);
                    spacecraft = new ExpensesName(exp);
                    expenseClassList.add(spacecraft);
                }
   }

在这里,您的expenseClassList遗嘱只包含唯一的字符串


推荐阅读