Iterator.next не работает - PullRequest
0 голосов
/ 13 июня 2018

я пытаюсь получить все значения для всех дочерних элементов из базы данных 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 голосов
/ 13 июня 2018

Вы создаете новый 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));
}
0 голосов
/ 13 июня 2018

Вызывая dataSnapshot.getChildren().iterator().next() внутри вашего цикла, вы получаете только первый элемент, возвращаемый dataSnapshot.getChildren().Попробуйте вывести итератор за пределы цикла:

Iterator<DataSnapshot> it = dataSnapshot.getChildren().iterator();
while (it.hasNext()) {
   String nextValue = it.next().getValue(String.class);

   names.add(nextValue);
}

Редактировать: не заметил, что вы определили этот тип ..

0 голосов
/ 13 июня 2018

Это может работать лучше для вас:

for (DataSnapshot child : dataSnapshot.getChildren()) {
    names.add(child.getValue(String.class));
}
Toast.makeText(signup.this,""+names,Toast.LENGTH_LONG).show();

Эта форма цикла перебирает коллекцию, возвращаемую при вызове getChildren().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...