Вы не можете вернуть то, что еще не было загружено. Метод onComplete()
имеет асинхронное поведение, что означает, что он вызывается еще до того, как вы пытаетесь добавить эти объекты типа Event
в eventList
ArrayList. Вот почему ваш список всегда пуст за пределами этого метода. Другими словами, к тому времени, когда вы возвращаете eventList
, данные еще не закончили загрузку из базы данных, поэтому для решения этой проблемы вам нужно создать свой собственный обратный вызов, чтобы дождаться данных. Итак, сначала вам нужно создать такой интерфейс:
public interface MyCallback {
void onCallback(List<Event> eventList);
}
Затем вам нужно создать метод, который на самом деле получает данные из базы данных. Этот метод должен выглядеть следующим образом:
public void readData(MyCallback myCallback) {
firestoreDB.collection("events")
.whereEqualTo("type", eventType)
.get()
.addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
@Override
public void onComplete(@NonNull Task<QuerySnapshot> task) {
if (task.isSuccessful()) {
List<Event> eventList = new ArrayList<>();
for(DocumentSnapshot doc : task.getResult()) {
Event e = doc.toObject(Event.class);
e.setId(doc.getId());
eventList.add(e);
}
myCallback.onCallback(eventList);
} else {
Log.d(TAG, "Error getting documents: ", task.getException());
}
}
});
}
В конце просто вызовите метод readData()
и передайте экземпляр интерфейса MyCallback
в качестве аргумента, где бы он вам ни понадобился, например:
readData(new MyCallback() {
@Override
public void onCallback(List<Event> eventList) {
Log.d("TAG", eventList.toString);
}
});
Это единственный способ использовать eventList
вне onComplete()
метода. Для получения дополнительной информации, вы также можете посмотреть это видео .