如何从匿名内部 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 错误 - 不要留空
我在数据库上有一个 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 错误 - 不要留空