我在数据库上有一个ArrayList,并且有一个引用数据库并返回列表的getArrayList函数。 问题是我无法保存数组列表,因为我是从内部类中获取的。
* ArrayList等待列表是在外部定义的
private ArrayList<FirebaseUser> getWaitingList (String uid){
database.child("books").child(""+itemNum+1)
.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot d:dataSnapshot.getChildren()){
if(d.getKey().equals("waiting list"));
GenericTypeIndicator<ArrayList<FirebaseUser>> t = new GenericTypeIndicator<ArrayList<FirebaseUser>>() {};
waiting_list = d.getValue(t);// this is the problem
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
return waiting_list; //I beleive that waiting_list is still null here
}
答案 0 :(得分:1)
您是正确的,该列表仍然为空,因为您从未等待过网络上的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错误的通知-请勿空白