如何避免ListView Firebase中的重复数据

时间:2018-10-10 15:52:46

标签: android firebase listview firebase-realtime-database

我知道已经问过这个问题了,所以我关注了this Question

我的Firebase结构。

enter image description here

我需要在listview中显示expensesName。 如果重复数据不止一次,则该数据应仅在列表视图中显示一次,那么该数据将不会重复,如果在Firebase中没有重复数据,则该数据也应在列表视图中可见。

我已经尝试过下面的代码来删除重复的数据,但不适用于在Firebase中不重复的数据。

例如在我的火力基地中

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

我需要输出

oil
petrol

但是实际输出是

oil

MainActivity

 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) {

        }
    });

2 个答案:

答案 0 :(得分:0)

为什么不使用HashSet代替ArrayList?

奇怪的是,您没有得到concurrent modification exception。迭代时无法将其从列表中删除。 Link

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仅包含唯一的字符串

答案 1 :(得分:-1)

使用HashSet代替ArrayList

    HashSet<String> expenseClassList = new HashSet<>();

     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()) {
                if(!expenseClassList.contains(data.child("expensesName").getValue(String.class)){
                       expenseClassList.add(spacecraft);
                    }                    
                }
                        Log.d("Tag", " list Adpter");
                        adapter.notifyDataSetChanged();
    }