Отобразить элементы массива, специфичные для Firebase, в ListView - PullRequest
0 голосов
/ 18 сентября 2018

У меня есть скрипт на python, который добавляет данные в реальном времени на базе Firebase.Скрипт использует камеру, чтобы определить, какая еда есть в холодильнике, и добавляет, что найдено.Я хочу создать приложение для Android, которое извлекает самые свежие данные (то есть самое последнее обнаружение, которое сделала веб-камера)

Например, на изображении ниже, последнее обнаружение еды было просто yogurt ипредыдущий был yogurt и egg

enter image description here

Я использую следующий код для отображения доступных продуктов в listview

rv = (ListView) findViewById(R.id.myrv);
ref = FirebaseDatabase.getInstance().getReference();

final ArrayAdapter<String> adpt = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, foodList);
rv.setAdapter(adpt);

ref.child("fridge").orderByKey().limitToLast(1).addChildEventListener(new ChildEventListener() {
    @Override
    public void onChildAdded(DataSnapshot dataSnapshot, String s) {
        String message = dataSnapshot.getValue(String.class);
        foodList.add(message);
        adpt.notifyDataSetChanged();
    }

    @Override
    public void onChildChanged(DataSnapshot dataSnapshot, String s) {

    }

    @Override
    public void onChildRemoved(DataSnapshot dataSnapshot) {

    }

    @Override
    public void onChildMoved(DataSnapshot dataSnapshot, String s) {

    }

    @Override
    public void onCancelled(DatabaseError databaseError) {

    }
});

Я ожидаю, что yogurt будет отображаться в listview, но у меня появляется эта ошибка

com.google.firebase.database.DatabaseException: Failed to convert value of type java.util.HashMap to String
    at com.google.android.gms.internal.zzelw.zzb(Unknown Source)
    at com.google.android.gms.internal.zzelw.zza(Unknown Source)
    at com.google.firebase.database.DataSnapshot.getValue(Unknown Source)

Мне интересно, правильный ли это код для получения того, что в food за самую последнюю key и как исправить ошибку hashmap

Спасибо

Ответы [ 2 ]

0 голосов
/ 19 сентября 2018

Это решение, которое я выбрал на случай, если кому-то понадобится

food = (TextView) findViewById(R.id.food);
        rv = (ListView) findViewById(R.id.myrv);
        ref = FirebaseDatabase.getInstance().getReference().child("fridge2");
        final ArrayAdapter<String> adpt = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, myfoodList);
        rv.setAdapter(adpt);

        ref.orderByKey().limitToLast(1).addChildEventListener(new ChildEventListener() {
            @Override
            public void onChildAdded(DataSnapshot dataSnapshot, String s) {
               // ArrayList message = dataSnapshot.getValue(ArrayList.class);

                GenericTypeIndicator<List<String>> t = new GenericTypeIndicator<List<String>>() {};
                List<String> message = dataSnapshot.getValue(t);

                myfoodList.clear();
                myfoodList.addAll(message);

                //myfoodList = message;
                adpt.notifyDataSetChanged();
            }
0 голосов
/ 18 сентября 2018

Здесь:

String message = dataSnapshot.getValue(String.class);

Может вызвать проблему, так как кажется, что вы получаете String.class hashmap как String.

Попробуйте что-то вроде этого:

Map<String, Object> map = (Map<String, Object>) dataSnapshot.getValue();

Или затем получить ребенка на String:

for(DataSnapshot ds : dataSnapshot.getChildren()) {

   String myString = ds.child("food").getValue(String.class));

   // print myString or add to list..
}

Правка № 2:

Это также может быть сделанодобавление еще одного дочернего элемента (food):

ref = FirebaseDatabase.getInstance().getReference().child("fridge").child("food")...// listener

С вашей первой структурой.

Используйте метод runOnUiThread(), затем уведомите об изменении данных или т. д., чтобы применить пользовательский интерфейс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...