在ListView中显示Firebase特定子级的数组项

时间:2018-09-18 15:48:24

标签: android firebase firebase-realtime-database

我有一个Python脚本,可以在Firebase上实时添加数据。 该脚本使用摄像头检测冰箱中有哪些食物,并添加发现的食物。 我想构建一个Android应用,以获取最新数据(即网络摄像头进行的最新检测)

例如,在下面的图像中,上次食物检测仅为yogurt,之前的食物检测为yogurtegg

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的{​​{1}}中内容的正确代码,以及如何解决key错误

谢谢

2 个答案:

答案 0 :(得分:1)

这里:

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

这可能是导致问题的原因,因为您似乎将String.class的{​​{1}} 哈希图

尝试这样的事情:

String

或者生孩子然后去Map<String, Object> map = (Map<String, Object>) dataSnapshot.getValue();

String

编辑#2:

也可以通过添加另一个孩子(for(DataSnapshot ds : dataSnapshot.getChildren()) { String myString = ds.child("food").getValue(String.class)); // print myString or add to list.. } )来完成:

food

使用第一个结构。

使用ref = FirebaseDatabase.getInstance().getReference().child("fridge").child("food")...// listener 方法,然后通知数据更改等以影响UI。

答案 1 :(得分:0)

这是我最终得到的解决方案,以防万一有人需要它

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();
            }