如何收听Firebase数据库集合中的更改?

时间:2020-06-10 12:17:51

标签: java android firebase android-recyclerview google-cloud-firestore

我有以下代码:

someDocumentRef.collection("data").get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {

    @Override
    public void onComplete(@NonNull Task<QuerySnapshot> task) {
        if (task.isSuccessful()) {
            RelativeLayout emptyLayout = fragmentView.findViewById(R.id.empty_layout);
            if (task.getResult() == null || task.getResult().isEmpty()) {
                emptyLayout.setVisibility(View.VISIBLE);
                rv.setVisibility(View.GONE);
            } else {
                Map<Character,List<QueryDocumentSnapshot>> dataDoc = new HashMap<>();
                for (QueryDocumentSnapshot document : task.getResult()) {
                    char letter = getFirstLetter(document.getString("full_name"));
                    List<QueryDocumentSnapshot> l = dataDoc.get(letter);
                    if (l == null) {
                        l = new ArrayList<>();
                        l.add(document);
                        dataDoc.put(letter, l);
                    } else {
                        l.add(document);
                    }
                }

                // Create recycler view
                emptyLayout.setVisibility(View.GONE);
                rv.setVisibility(View.VISIBLE);
                adapter = new DataAdapter(getActivity(), dataDoc);
                rv.setLayoutManager(new LinearLayoutManager(getActivity()));
                rv.setAdapter(adapter);
            }
        }
    }
});

在我的onCreateView方法中(片段)。基本上,它从Firebase数据库的集合data获取所有文档,并将其传递给适配器,以创建回收站视图。效果很好,但是我的问题是如何监听数据库中的更改,以及在插入或删除一些新文档后,如何更新回收站视图?请注意,我不使用FirestoreRecyclerAdapter适配器,而是使用我的自定义适配器。另外,我正在使用Firebase Cloud数据库。

1 个答案:

答案 0 :(得分:1)

您实际上可以收听Firebase的更改,对于之前的评论感到抱歉。我查看了消防商店的文件,并看到了

final DocumentReference docRef = 
db.collection("cities").document("SF");
docRef.addSnapshotListener(new 
 EventListener<DocumentSnapshot>() {
  @Override
  public void onEvent(@Nullable DocumentSnapshot 
 snapshot,
                    @Nullable FirebaseFirestoreException e) {
    if (e != null) {
        Log.w(TAG, "Listen failed.", e);
        return;
    }

    if (snapshot != null && snapshot.exists()) {
        Log.d(TAG, "Current data: " + snapshot.getData());
    } else {
        Log.d(TAG, "Current data: null");
      }
   }
 });

引用自https://firebase.google.com/docs/firestore/query-data/listen

我希望对您有帮助

修改 要收听整个收藏集:

    db.collection("cities")
    .addSnapshotListener(new 
     EventListener<QuerySnapshot>() {
        @Override
        public void onEvent(@Nullable QuerySnapshot value,
                            @Nullable FirebaseFirestoreException e) 
           {
            if (e != null) {
                Log.w(TAG, "Listen failed.", e);
                return;
            }

            List<String> cities = new ArrayList<>();
            for (QueryDocumentSnapshot doc : value) {
                if (doc.get("name") != null) {
                    cities.add(doc.getString("name"));
                }
            }
            Log.d(TAG, "Current cites in CA: " + cities);
        }
      });

这肯定会听取整个收藏。 参考:https://stackoverflow.com/a/48608816/8714139

修改,了解如何获取您的值

        Map<Character,List<QueryDocumentSnapshot>> dataDoc = new HashMap<>();
            for (QueryDocumentSnapshot document : value) {
                char letter = getFirstLetter(document.getString("full_name"));
                List<QueryDocumentSnapshot> l = dataDoc.get(letter);
                if (l == null) {
                    l = new ArrayList<>();
                    l.add(document);
                    dataDoc.put(letter, l);
                } else {
                    l.add(document);
                }
            }