我正在尝试将firebase数据库中的密钥添加到onDataChange方法中的arraylist。
mDatabase = FirebaseDatabase.getInstance().getReference("events");
mDatabase.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if(dataSnapshot.exists()) {
for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
String event = snapshot.getKey();
Log.d("did it work??", event);
eventList.add(event);
}
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
当我记录事件时,它会打印但不添加到eventList arrayList
答案 0 :(得分:3)
如果您希望将整个快照传递给收听者,请使用addValueEventListener
或addListenerForSingleValueEvent
。
如果使用addValueEventListener
,将使用初始快照调用侦听器,如果数据库发生更改,则会再次调用侦听器。
如果您使用addListenerForSingleValueEvent
,则只会使用初始快照调用一次侦听器。
听众收到的快照将包括所有孩子。要迭代它们,你会做这样的事情:
@Override
public void onDataChange(DataSnapshot snapshot) {
ArrayList<String> ids = new ArrayList<String>();
for (DataSnapshot childSnapshot: snapshot.getChildren()) {
ids.add(childSnapshot.getValue().toString());
}
}
答案 1 :(得分:1)
这种情况正在发生,因为onDataChange
方法是异步调用的。这意味着在调用ArrayList
方法之前执行将字符串添加到onDataChange()
的语句。这就是为什么你的列表在该方法之外是空的。因此,为了使用ArrayList
,您需要在onDataChange()
方法中声明并使用它。
ArrayList<String> ids = new ArrayList<>();
如果您想在ArrayList
方法之外使用onDataChange()
,请参阅此post的答案。
希望它有所帮助。