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

时间:2018-08-29 10:49:12

标签: android firebase firebase-realtime-database anonymous-inner-class

我在数据库上有一个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
}

1 个答案:

答案 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错误的通知-请勿空白