Вы создаете ссылку с этим:
database = FirebaseDatabase.getInstance();
myRef = database.getReference().child("Sold").child("Item");
И затем вы добавляете ChildEventListener
.Это означает, что DataSnapshot
в вашем onChildAdded
будет вызываться сначала со снимком узла DUMMY 1
, а затем со снимком узла DUMMY 2
.
Вы звоните dataSnapshot.getValue(String.class)
в onChildAdded
.Но поскольку DUMMY 1
и DUMMY 2
имеют несколько свойств, у них нет единственного строкового значения.Таким образом, этот вызов возвращает null
, что, вероятно, вызывает у вас проблемы.
Если вы хотите добавить сам ключ DUMMY 1
, DUMMY 2
к адаптеру, вы можете вызвать dataSnapshot.getKey()
.В противном случае вы можете получить значение определенных дочерних свойств с помощью dataSnapshot.child("Description").getValue(String.class)
.
Итак:
myRef.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
String key = dataSnapshot.getKey();
String description = dataSnapshot.child("Description").getValue(String.class);
Long quantity = dataSnapshot.child("Quantity").getValue(Long.class);
myArrayList.add(key+": "+description+" ("+quantity+")");
myArrayAdapter.notifyDataSetChanged();
}
Если вы хотите прочитать все значение в классе, представляющемэлемент (так называемый POJO), самый простой класс:
public class Item {
public String Description;
public Long Quantity;
}
Обратите внимание, что имя (включая регистр) полей должно точно соответствовать именам свойств в вашей базе данных.Вы можете использовать вышеуказанный класс следующим образом:
myRef.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
String key = dataSnapshot.getKey();
Item item = dataSnapshot.getValue(Item.class);
myArrayList.add(key+": "+item.description+" ("+item.quantity+")");
myArrayAdapter.notifyDataSetChanged();
}