Вы правы, список по-прежнему равен нулю, потому что вы никогда не ожидаете результатов Firebase по сети, ваш код только устанавливает прослушиватель, а затем сразу возвращает пустой список.
Вместо этого блокирующего вызова из вашего метода
someList = getWaitingList (String uid);
// use someData
Вы должны делать что-то вроде этого асинхронного вызова
// Do NOT make a list variable outside of this
getWaitingList (String uid, new Listener() {
@Override onData(List someData) {
// use someData, for example, update a listview
}
});
// do NOT reference the list outside of the listener block method
Как говорится,
Определить интерфейс
interface UserListListener {
void onUsers(List<FirebaseUser> users);
}
Добавьте параметр в метод и сделайте его недействительным, потому что вы вернетесь из интерфейса
void getWaitingList (String uid, final UserListListener listener) {
...
И остальная часть кода Firebase, возможно, в порядке, но вы зацикливаетесь на вещах, поэтому я думаю, что вы хотите добавить в список, а не просто назначить один, но в любом случае, вот и остальная часть метода, использующего Обратный звонок
GenericTypeIndicator<ArrayList<FirebaseUser>> t = new GenericTypeIndicator<ArrayList<FirebaseUser>>() {};
// Move the list inside this listener
List<FirebaseUser> waitingList = new ArrayList<>();
for (DataSnapshot d:dataSnapshot.getChildren()){
if(d.getKey().equals("waiting list")) {
waitingList = d.getValue(t);
}
}
listener.onUsers(waitingList); // end of the method
Тогда внешний вызов метода отвечает за реализацию класса слушателя и получение данных.
Вы также захотите реализовать onCancelled
; Рекомендуется сначала реализовать это, потому что именно там вы будете получать уведомления об ошибках Firebase - не оставляйте это поле пустым