如何从匿名内部 class 更改外部 class 的变量?

How can I change variable of an outside class from anonymous inner class?

我在数据库上有一个 ArrayList,我有一个引用数据库和 returns 列表的函数 getArrayList。 问题是我无法保存数组列表,因为我是从内部 class.

获取的

*ArrayList waiting_list 定义在

之外
 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
}

你是对的,列表仍然是空的,因为你从不等待网络上的 Firebase 结果,你的代码只是设置一个侦听器,然后立即 returning 一个空列表。

而不是来自您的方法的阻塞调用

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);
} 

向该方法添加一个参数并使其无效,因为您将 return 来自接口

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

然后外部方法调用负责实现监听器class,并获取数据。

您还需要实施 onCancelled ;最好先实施它,因为它会通知您 Firebase 错误 - 不要留空