Как мне написать правильный класс для имени элемента и количества элементов Android Firebase - PullRequest
0 голосов
/ 25 апреля 2018

Я пытаюсь получить данные инвентаризации и, в конце концов, отобразить их в виде списка с помощью адаптера массива.По сути, мне нужно добавить каждый объект элемента в список, а затем с помощью 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();
                }
            });

Ответы [ 4 ]

0 голосов
/ 25 апреля 2018

В вашем 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.

0 голосов
/ 25 апреля 2018

изменить это

а также я надеюсь, что вы вставляете данные в соответствии с классом POJO элемента, если они отличаются, а не получают данные.

mydb.child("Users").child("UserID").child("inventory")
0 голосов
/ 25 апреля 2018

Предположим, что ваша структура выглядит следующим образом:

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) и покончить с этим.

0 голосов
/ 25 апреля 2018

Вот как должен выглядеть класс вашей модели:

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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...