Как сделать ListView правильно refre sh? - PullRequest
0 голосов
/ 18 января 2020

У меня есть просмотр списка, который получает массив объектов и отображает на экране, этот массив объектов берется из базы данных в firebase, когда я добавляю или удаляю документ (объект) из базы данных, однако просмотр списка обычно обновляется, когда я изменяю одно поле объекта (документ), просмотр списка полностью воссоздает этот объект в представлении и «дублирует» каждый раз при изменении поля состояния.

Это мой код, заполняющий представление списка:

usuarios.orderBy("likes", Query.Direction.DESCENDING);
        try {
            usuarios.addSnapshotListener(new EventListener<QuerySnapshot>() {
                @Override
                public void onEvent(@Nullable QuerySnapshot queryDocumentSnapshots, @Nullable FirebaseFirestoreException e) {
                    if (e != null) {
                        Log.w("Não consegue", "listen:error", e);
                        return;
                    }

                    for (DocumentChange dc : queryDocumentSnapshots.getDocumentChanges()) {
                        switch (dc.getType()) {
                            case ADDED:
                                Log.d("TAG", "New Msg: " + dc.getDocument().toObject(Doenca.class));
                                doenca = dc.getDocument().toObject(Doenca.class);
                                doencaArrayList.add(doenca);
                                break;
                            case REMOVED:
                                Log.d("TAG", "Removed Msg: " + dc.getDocument().toObject(Doenca.class));
                                doenca = dc.getDocument().toObject(Doenca.class);
                                doencaArrayList.add(doenca);
                                break;
                            case MODIFIED:
                                // doencaArrayList.remove(doencaArrayList.lastIndexOf(doenca));
                                Log.d("TAG", "Modified: " + dc.getDocument().toObject(Doenca.class));
                                doenca = dc.getDocument().toObject(Doenca.class);

                                doencaArrayList.add(doenca);
                                break;
                        }
                    }
                   ListView listView = (ListView) root.findViewById(R.id.recyclerViewCadPat);
                   ArrayAdapter adapter = new DoencaAdapter(getActivity(), doencaArrayList);
                   listView.setAdapter(adapter);
                    adapter.notifyDataSetChanged();
                }
            });
        }catch (NullPointerException e){
            Toast.makeText(getActivity(), "Erro interno", Toast.LENGTH_SHORT).show();
        }

Обратите внимание, что есть 3 состояния: одно из: добавление (все в порядке), удаление (все в порядке) и одно изменение (это делает просмотр списка дублирующим объект).

1 Ответ

1 голос
/ 18 января 2020

Когда в базе данных firebase обновляются определенные данные, вызывается onEvent of EventListener, и ваш список получит обновленные значения, но он по-прежнему будет иметь старые значения. Итак, сначала очистите список, а затем добавьте в него данные в методе onEvent.

Примерно так

public void onEvent(@Nullable QuerySnapshot queryDocumentSnapshots, @Nullable FirebaseFirestoreException e) {
   if (e != null) {
       Log.w("Não consegue", "listen:error", e);
       return;
   }

   //clear your list first
   doencaArrayList.clear();
   ...
   ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...