![](/img/trans.png)
[英]ConcurrentModificationException on Iterator.next()
[英]Iterator.next is not working
試圖從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) {
}
});
我可以將迭代器添加到列表中嗎? 我想要最簡單的方法
您將在循環的每次迭代中創建一個新的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));
}
這可能更好地為你工作:
for (DataSnapshot child : dataSnapshot.getChildren()) {
names.add(child.getValue(String.class));
}
Toast.makeText(signup.this,""+names,Toast.LENGTH_LONG).show();
這種循環形式遍歷了對getChildren()
的調用返回的集合。
通過在循環內調用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);
}
編輯:沒有注意到您定義了該類型。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.