【问题标题】:How to do ListView correct refresh?ListView如何正确刷新?
【发布时间】:2020-01-18 18:34:49
【问题描述】:

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

【问题讨论】:

    标签: android android-listview google-cloud-firestore


    【解决方案1】:

    当在 firebase 数据库中更新特定数据时,将调用 EventListener 的 onEvent 并且您的列表将获得更新的值,但它仍然具有旧值。所以,首先,清除列表,然后在 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();
       ...
       ...
    }
    

    【讨论】:

    • 这个方法从 ArrayList 中删除所有类型的数据,即使是那些没有被修改过的数据。
    • 是的,会的。但同样,由于您要对每个文档进行迭代,只需将其直接添加到列表中,而不使用 dc.getType()。
    • 但我不是没有 dc.getType 了吗?
    • 你是在告诉我要添加 Switch 吗?
    • 是的,肯定会的。我认为这是另一个问题。好吧,为了更好地实现,您可以使用Firebase-UI。但是按照我的建议实施肯定会让您摆脱列表中的重复值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-08
    • 1970-01-01
    • 1970-01-01
    • 2021-05-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多