Как избежать дублирования данных в базе просмотра списка - PullRequest
0 голосов
/ 10 октября 2018

Я знаю, что этот вопрос уже задавался, и я следовал на этот вопрос .

Моя структура Firebase.

enter image description here

Мне нужно отобразить Расходы Имя в списке.Если данные повторяются более одного раза, они должны отображать данные в виде списка только один раз, дубликаты данных отсутствуют, а если в базе данных 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 голосов
/ 10 октября 2018

используйте 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();
    }
0 голосов
/ 10 октября 2018

Почему бы не использовать 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 будет содержать только уникальные строки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...