Ответ от faiizii имеет суть проблемы: у вас может быть только один адаптер в виде списка, поэтому вы должны вызывать setAdapter
только один раз. Поскольку onChildAdded
будет вызываться для каждого дочернего элемента, вы не должны вызывать setAdapter
там (ни в одном из других onChild...
методов).
Решение состоит в том, чтобы переместить вызовы на setAdapter
из слушателя:
list = new ArrayList<>();
adapter = new ArrayAdapter<String>(this,R.layout.list_item,R.id.ItemNameIds,list);
mlistView.setAdapter(adapter);
ref.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
fooditem = dataSnapshot.getValue(FoodItemclass.class);
list.add(fooditem.getName()+": "+fooditem.getPrice());
adapter.notifyDataSetChanged();
}
...
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
throw databaseError.toException();
}
});
Как вы увидите, мы теперь называем notifyDataSetChanged()
внутри onChildAdded
. Это позволяет адаптеру узнать, что его данные изменились, что, в свою очередь, означает, что он обновляет представление списка.