Как увидеть изменения в реальном времени из Firestore при использовании addSnapshotListener? - PullRequest
0 голосов
/ 06 февраля 2019

У меня есть коллекция продуктов, и я хочу получать обновления в реальном времени.Это мой код:

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 голосов
/ 06 февраля 2019

Вы еще не добавили обновленные данные о продукте в list.

case MODIFIED:
    Product product = documentChange.getDocument().toObject(Product.class);
    // TODO: Replace the existing product in the list with the updated one
    adapter.notifyDataSetChanged();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...