从firebase数据库中获取所有子项的所有值,但是当我在下面运行此代码时,我只会多次获得第一个子值。
names=new ArrayList<>();
rootRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot dataSnapshot1:dataSnapshot.getChildren()) {
i = i + 1;
names.add(dataSnapshot.getChildren().iterator().next().getValue(String.class));
}
Toast.makeText(signup.this,""+names,Toast.LENGTH_LONG).show();
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
我可以将迭代器编入列表吗? 我想要最简单的方法来做到这一点
答案 0 :(得分:2)
您在循环的每次迭代中都创建了一个新的dataSnapshot.getChildren().iterator()
。尝试在循环中使用foreach的值:
for(DataSnapshot dataSnapshot1 : dataSnapshot.getChildren()){
i = i + 1;
names.add(dataSnapshot1.getValue(String.class));
}
或者如果你想使用迭代器,那就这样做,所以它只创建一次:
for(Iterator<DataSnapshot> it = dataSnapshot.getChildren().iterator(); it.hasNext(); ){
i = i + 1;
names.add(it.next().getValue(String.class));
}
或者你可以使用while循环,它基本上等于上面的第二段代码:
Iterator<DataSnapshot> it = dataSnapshot.getChildren().iterator();
while(it.hasNext()){
i = i + 1;
names.add(it.next().getValue(String.class));
}
答案 1 :(得分:0)
这可能对您更有效:
for (DataSnapshot child : dataSnapshot.getChildren()) {
names.add(child.getValue(String.class));
}
Toast.makeText(signup.this,""+names,Toast.LENGTH_LONG).show();
循环的这种形式正在迭代调用getChildren()
返回的集合。
答案 2 :(得分:0)
通过在循环中调用dataSnapshot.getChildren().iterator().next()
,您只能获得dataSnapshot.getChildren()
返回的第一个元素。尝试在循环外部使用Iterator:
Iterator<DataSnapshot> it = dataSnapshot.getChildren().iterator();
while (it.hasNext()) {
String nextValue = it.next().getValue(String.class);
names.add(nextValue);
}
编辑:没有注意到你定义了那种类型..