Я пытаюсь извлечь данные инвентаризации и, в конце концов, отобразить их в списке с использованием адаптера массива. В основном мне нужно добавить каждый объект элемента в список, а затем с помощью itemobject.getName () мне нужно получить доступ к имени элемента.
Users
UserID
inventory
0
name:coffee
count:1
1
name:testitem
count:2
Класс предмета:
public class Item {
private String name;
private int count;
public Item(){
}
public String getName(){
return name;
}
public int getCount(){
return count;
}
}
Вот как я беру данные:
inventoryview.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mydb.child("users").child(uid).child("inventory").addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
String data = dataSnapshot.getValue().toString();
Log.d("asd",data);
Item item = dataSnapshot.getValue(Item.class);
//iterate through incoming data and add item objects to list
Log.d("itemname",item.getName());
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
Toast.makeText(getActivity(),
"Inventory clicked.",
Toast.LENGTH_LONG).show();
}
});
Итак, для нескольких элементов, как мне это сделать




Вот как должен выглядеть ваш класс модели:
public class Item {
private String name;
private int count;
public Item() {}
public Item(String name, int count) {
this.name = name;
this.count = count;
}
public String getName() { return name; }
public void setName(String name) { this.name = name; }
public int getCount() { return count; }
public void setCount(int count) { this.count = count; }
}
Он содержит общедоступный конструктор без аргументов и соответствующие общедоступные сеттеры и геттеры.
Чтобы создать элемент класса Item, просто создайте новый объект и передайте его методу setValue() следующим образом:
Item item = new Item("Name", 1);
yourRef.setValue(item);
Я пытаюсь получить данные инвентаризации и отобразить имя каждого элемента. Как мне это сделать?
Очень просто. Если вы хотите получить данные из базы данных Firebase и отобразить их в RecyclerView с помощью FirebaseRecyclerAdapter, это - это то, как вы можете это сделать.
Я просто хочу получить доступ к имени элемента, который я извлекаю из базы данных. В инвентаре может быть несколько элементов, я не знаю, как структурировать его в базе данных и как структурировать его как класс. Например, если структура такая, как я достигаю каждого название и количество предметов ??? prntscr.com/j9y0le
Поэтому, чтобы получить доступ только к названиям элементов, следуйте пояснениям в этом сообщении. Структура должна быть такой же, как я показал вам в своем ответе.
@AlexMamo Сеттеры не требуются. Если для свойства JSON нет установщика, клиент Firebase установит значение непосредственно в поле. Конструктор с аргументами также не требуется. Хотя оба они идиоматичны, есть хорошие случаи, когда занятия без них.
@FrankvanPuffelen Вы правы, я знаю, что мы можем их опустить. Я просто попытался показать ОП, как может выглядеть полный класс модели в соответствии с тем, что он спросил, How do i write correct Class for Item name. Бывают ситуации, когда сеттеры, на мой взгляд, намного проще в использовании. К тому времени, когда я придумал свой ответ, у OP была полностью другая структура базы данных, потому что тем временем он редактировал сообщение. Теперь, увидев ваш ответ, я могу сказать, что это наверняка решит проблему OP.
Ах это объясняет. Тогда не беспокойтесь. Я просто хочу убедиться, что мы все четко указали, какие вещи требуются, а какие - идиоматичны, а какие являются личными предпочтениями. Все трое в порядке, если ясно.
изменить это
а также я надеюсь, что вы вставляете данные в соответствии с классом POJO элемента, если он отличается, а не получает данные.
mydb.child("Users").child("UserID").child("inventory")
Предположим, ваша структура выглядит следующим образом:
Root
|___Item1
| |___name : "name1"
| |___count: "count1"
|
|___Item2
| |___name : "name2"
| |___count: "count2"
|___Item3
| |___name : "name3"
| |___count: "count3"
Я бы добавил слушателя к Root и вызвал dataSnapshot.getChildren() и перебирал бы потомков, используя цикл for-each. Теперь для каждого ребенка я могу вызвать data.getValue(Item.class) и покончить с этим.
Вам не хватает петли в вашем onDataChange:
mydb.child("users").child(uid).child("inventory").addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot childSnapshot: dataSnapshot.getChildren()) {
Log.d("itemname", childSnapshot.getChild("name").getValue());
Item item = childSnapshot.getValue(Item.class);
Log.d("itemname",item.getName());
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
throw databaseError.toException(); // don't ignore errors
}
}
Если этот первый оператор журнала выводит правильное значение, а второй - нет, у вас есть несоответствие между вашим классом Java и структурой JSON.
Вы также не сохраняете данные POJO в базе данных. У вас должен быть узел под названием «Элемент» и внутри него узлы с именем «имя» и «счетчик», тогда вы сможете получить данные.