Firebase - запрос данных Firestore дважды вызывается два раза - PullRequest
0 голосов
/ 02 февраля 2019

У меня есть код, который должен обновить пользовательский интерфейс со всеми данными в Cloud Firestore в коллекции, а затем обновить пользовательский интерфейс при добавлении элемента.Я использовал Recycler для добавления дополнительных данных:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_events);
    ButterKnife.bind(this);
    Toolbar toolbar = findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);

collection_events
            .get()
            .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() 
{
                @Override
                public void onComplete(@NonNull Task<QuerySnapshot> task) {
                    if (task.isSuccessful()) {
                        for (QueryDocumentSnapshot snapshot: 
Objects.requireNonNull(task.getResult())){
                            EventsCurrent eventsCurrent = 
snapshot.toObject(EventsCurrent.class);
                            eventsCurrent.setId(snapshot.getId());
                            Log.d(TAG,snapshot.getId());
                            eventsCurrentList.add(eventsCurrent);
                        }
                        LinearLayoutManager linearLayoutManager = new 
LinearLayoutManager(getApplicationContext());
                        eventsAdapter = new 
EventsAdapter(EventsActivity.this,eventsCurrentList);
                        eventsAdapter.setEventsCurrents(eventsCurrentList);

recylerview_events.setLayoutManager(linearLayoutManager);
                        recylerview_events.setHasFixedSize(true);
                        recylerview_events.setAdapter(eventsAdapter);
                        isFirstTime = false;
                    }else {
                        Log.d(TAG, "Error getting documents: ", 
task.getException());
                    }
                }
            });


    db.collection("current_events")
            .addSnapshotListener(new EventListener<QuerySnapshot>() {
                @Override
                public void onEvent(@Nullable QuerySnapshot 
queryDocumentSnapshots, @Nullable FirebaseFirestoreException e) {
                    if (e != null) {
                        Log.w(TAG, "listen:error", e);
                        return;
                    }
                    for(DocumentChange dc: 
queryDocumentSnapshots.getDocumentChanges()){
                        switch (dc.getType()){
                            case ADDED:
                                if (!isFirstTime) {

eventsAdapter.addEvent(dc.getDocument().toObject(EventsCurrent.class));

eventsAdapter.notifyItemInserted(eventsAdapter.numberOfevents());
                                }
                                break;
                            case MODIFIED:
                                eventsAdapter.notifyDataSetChanged();
                                break;
                        }
                    }

                }
            });
}

Здесь я использую и get() & addSnapshotListener(), так что я первоначально получаю все данные через get(), а обновленные или добавленные данные через addSnapshotListener().

Проблема, при которой вызывается слушатель, и мои данные удваиваются, а данные заполняются дважды.

Кто-нибудь может мне помочь?

1 Ответ

0 голосов
/ 03 февраля 2019

Проблема, когда слушатель вызывается, и мои данные удваиваются, а данные заполняются дважды.

Это происходит потому, что вы используете get() & addSnapshotListener() для полученияданные в то же время.На самом деле это означает, что вы получаете данные из базы данных один раз в секунду, вы получаете данные снова, но в режиме реального времени, и поэтому ваши данные удваиваются.Если вы хотите получить данные в режиме реального времени, используйте только addSnapshotListener().Если вы хотите получить его только один раз, просто используйте вызов get().Оба метода имеют одинаковое поведение, но в случае addSnapshotListener() слушатель остается активным, пока вы не удалите его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...