Iterator.next不起作用

时间:2018-06-13 14:42:44

标签: java android firebase firebase-realtime-database iterator

从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) {

            }
        });

我可以将迭代器编入列表吗?     我想要最简单的方法来做到这一点

3 个答案:

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

编辑:没有注意到你定义了那种类型..