ListView如何正确刷新?

问题描述 投票:0回答:1

我有一个列表视图,该列表视图接收对象的数组列表并显示在屏幕上,该对象数组列表取自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种状态,一种是添加(所有),删除(所有),另一种是修改(这会使listview复制对象)。

android android-listview google-cloud-firestore
1个回答
1
投票

当在Firebase数据库中更新特定数据时,将调用EventListener的onEvent,并且您的列表将获得更新的值,但它仍然具有旧值。因此,首先清除列表,然后在onEvent方法中向其中添加数据。

© www.soinside.com 2019 - 2024. All rights reserved.