使用addSnapshotListener时如何查看Firestore的实时变化?

时间:2019-02-06 18:23:26

标签: android firebase google-cloud-firestore

我有一个产品集合,我想获取实时更新。这是我的代码:

query.addSnapshotListener(new EventListener<QuerySnapshot>() {
    @Override
    public void onEvent(@Nullable QuerySnapshot querySnapshot, @Nullable FirebaseFirestoreException e) {
        if (e != null) return;

        List<Product> list = new ArrayList<>();
        for (DocumentChange documentChange : querySnapshot.getDocumentChanges()) {
            switch (documentChange.getType()) {
                case ADDED:
                    Product product = documentChange.getDocument().toObject(Product.class);
                    list.add(product);
                    break;
                case MODIFIED:
                    adapter.notifyDataSetChanged();
                    break;
                case REMOVED:
                    //
                    break;
            }
        }
        adapter = new ProductAdapter(context, list);
        recyclerView.setAdapter(adapter);
    }
});

如果产品价格发生变化,而我的应用程序处于前台,则我的RecyclerView根本看不到变化。即使通知适配器,我仍然看到旧价格。也发生了一些奇怪的事情。如果第十个产品的价格发生变化,则滚动条将转到第一个位置。

价格更改后,如何查看实时更改?发生更改时,如何保留在RecyclerView中的当前位置?

编辑:

case MODIFIED:
    Product modifiedProduct = documentChange.getDocument().toObject(Product.class);
    for(Product p : list) {
        if(p.getProductName().equals(modifiedProduct.getProductName())) {
            list.remove(p);
        }
    }
    list.add(modifiedProduct);
    adapter.notifyDataSetChanged();

发生同样的事情。仍然看到旧价格。

1 个答案:

答案 0 :(得分:1)

您尚未将更新的产品数据放入list中。

case MODIFIED:
    Product product = documentChange.getDocument().toObject(Product.class);
    // TODO: Replace the existing product in the list with the updated one
    adapter.notifyDataSetChanged();