如何从Firebase检索子值?

时间:2019-06-18 11:52:45

标签: android firebase-realtime-database android-recyclerview

这是我的问题,我想在RecyclerView中显示所有电话号码吗?

databaseReference = firebaseDatabase.getReference("CallLog");
//in on data change method using for
CallLogList logList = snapshot.getValue(CallLogList.class);
                list.add(logList);

firebase strucure

ArrayList<HashMap<String, String>> arrayList = new ArrayList<HashMap<String,String>>(); 
HashMap<String, String> map = new HashMap<String, String>(); map.put("phone",phoneNumber); 
map.put("name",callName);
map.put("callType",dir);
map.put("date",dateString);
map.put("duration",callDuration+" seconds"); 
arrayList.add(map);
myRef.push().setValue(arrayList); 

2 个答案:

答案 0 :(得分:1)

首先,您应该将树更改为这样:

Call Log
-Calls
--Lhe...
---CallType OUTGOING
--Lhe...
---CallType INCOMING

接下来,在您的项目中创建与Firebase中相同的字段的“ Calls”类,然后创建callType,日期,持续时间和电话。 之后,使用此代码,您可以将数据库中的所有实例放入列表中:

    public void refreshList(DataSnapshot dataSnapshot) {
        List<Class> list = new ArrayList<>();
        for (DataSnapshot dataSnapshot1 : dataSnapshot.child("Calls").getChildren()) 
        {
            Item value = dataSnapshot1.getValue(Calls.class);
            list.add(value);
        }
    }

现在您有了Calls类的对象列表,从中可以轻松访问电话号码。

答案 1 :(得分:1)

从Firebase获取整个列表后,将它们逐个迭代以将它们添加到列表中,然后在循环中将它们设置在RecyclerView的适配器中,然后将适配器设置为所需的RecyclerView < / p>

 @Override
 public void onDataChange(DataSnapshot dataSnapshot) {
                // This method is called once with the initial value and again
                // whenever data at this location is updated.
                list = new ArrayList<CallLogList>();
                for(DataSnapshot dataSnapshot1 :dataSnapshot.getChildren()){

                   CallLogList logList = snapshot.getValue(CallLogList.class);
                   list.add(logList);

                }


                yourAdapter = YourAdapter(list);
                yourRecyclerView.setAdapter(yourAdapter);


            }

有关更多信息,here是一个完整的示例

注意:如果您使用的是LiveDataPaging,则适配器的设置会有所不同,请让我知道是否需要更多示例