【问题标题】:How to see the realtime change from Firestore when using addSnapshotListener?使用 addSnapshotListener 时如何查看 Firestore 的实时变化?
【发布时间】:2019-02-06 18:23:26
【问题描述】:

我有一系列产品,我想获得实时更新。这是我的代码:

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();

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

【问题讨论】:

    标签: android firebase google-cloud-firestore


    【解决方案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();
    

    【讨论】:

    • 感谢您的回答,但它不起作用。请查看我编辑的问题。
    • “它不起作用”不是很有帮助。 什么特别不适用于该代码?你在调试器中单步执行了吗?它是否找到产品并将其删除?您添加的新产品 (list.add(modifiedProduct)) 是否具有新属性(在调试器中检查时)?
    • 是的,你是对的,我调试了代码,现在它可以工作了,多亏了你。谢谢你。您是否偶然知道为什么在价格更改时滚动到第一个位置,我该如何避免这种情况?
    • 我不知道。但我敢打赌,搜索应该会给出一些相关的答案。例如,这看起来很有希望:stackoverflow.com/questions/28658579/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-26
    • 2020-07-16
    • 2019-11-05
    相关资源
    最近更新 更多