从 firebase 检索数据并将其显示在可扩展的 recyclerview 中

Posted

技术标签:

【中文标题】从 firebase 检索数据并将其显示在可扩展的 recyclerview 中【英文标题】:Retrieve data from firebase and display it in extendable recyclerview 【发布时间】:2022-01-24 06:40:40 【问题描述】:

在我检查关键节点是否存在之后,我想检索用户约会并在 recyclerview 中显示用户选择的时间 我有一个问题,当我从 firebase 检索数据时,它只显示我从 firebase 检索到的最后一个值的重复项以及所有用户的所有时间列表,因为适配器只触发一次......请提供帮助

这里是 json 这是代码

    private void RetriveAllAppointment(ArrayList<String> id_list) 
            DatabaseReference mrefDatabase = FirebaseDatabase.getInstance().getReference("Appointments").child("Active");
            mrefDatabase.addValueEventListener(new ValueEventListener() 
                @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot) 
                    if (dataSnapshot.exists()) 
                        MyBooking booking = new MyBooking();
                        times_list = new ArrayList<>();
                        clearall();
                        for (DataSnapshot snapshot : dataSnapshot.getChildren()) 
                          key = snapshot.getKey();
                          //loop over ids
                            for (int i = 0; i < id_list.size(); i++) 
                                if (id_list.get(i).equals(key)) 
                                    for (DataSnapshot Activesnapshot : snapshot.getChildren()) 
                                        String date = Activesnapshot.child("Date").getValue().toString();
                                        DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-M-d");
                                        LocalDate fromLocalDate = LocalDate.parse(date, dateTimeFormatter);
                                        if (fromLocalDate.equals(LocalDate.now())) 
                                            booking.setDate(Activesnapshot.child("Date").getValue().toString());
                                            booking.setVenueName(Activesnapshot.child("venueName").getValue().toString());
                                            booking.setUserbookedName(Activesnapshot.child("userbookedName").getValue().toString());
                                            booking_list.add(booking);
                                            DataSnapshot timesSnapshot = Activesnapshot.child("times");
                                            for (DataSnapshot timesnapshot : timesSnapshot.getChildren()) 
                                                time = timesnapshot.getValue().toString();
                                                times_list.add(time);
                                                booking.setTimesList(times_list);
                                                //  todayAdapter.notifyDataSetChanged();
                                            
    
                                        
 
                                        
                                   
  todayAdapter = new TodayReservationAdapter(booking_list, context);
TodayReservation_recyclerview.setAdapter(todayAdapter);
 todayAdapter.notifyDataSetChanged();

                                
                             
    
    
    
                    else
                        //display empty view
                    
                

【问题讨论】:

请编辑您的问题并将您的数据库结构添加为 JSON 文件。您可以通过单击 Firebase Console 的溢出菜单 (⠇) 中的导出 JSON 来获取它,并向我们展示您想要获取的确切数据。 我编辑我的问题并添加 firebase json @AlexMamo .getReference("Appointments").child("Active") 与您展示的 JSON 有什么关系? 这里的 json 是活动节点的子节点,它包含多个 id,我必须在它们和我的 id 列表之间进行比较,然后如果匹配,则获取该节点内的值 @FrankvanPuffelen 【参考方案1】:

从我在您的屏幕截图中可以看出,根目录下有两个动态级别:-MqV...fZ,然后是其下的子级,以 `-MrN-wGw" 开头。

这意味着您从数据中获得的DataSnapshot 也将包含两层带有动态键的嵌套快照,因此您需要在snapshot.getChildren() 上进行两个嵌套循环。

所以这样的事情应该更接近:

for (DataSnapshot childsnapshot : snapshot.getChildren()) 
  Log.i("database", "Key of first level child: "+childsnapshot.getKey());
  for (DataSnapshot Activesnapshot : childsnapshot.getChildren()) 
    Log.i("database", "Key of second level child: "+Activesnapshot.getKey());
    String date = Activesnapshot.child("Date").getValue(String.class);
    ...

【讨论】:

我已经在快照上添加了两个嵌套循环,第一个用于获取密钥,第二个用于获取快照值(如果匹配日期)但仍无法正确获取第二个值的值@FrankvanPuffelen

以上是关于从 firebase 检索数据并将其显示在可扩展的 recyclerview 中的主要内容,如果未能解决你的问题,请参考以下文章

Swift - 如何从 Firebase 检索多个值并将它们显示在 UITABLEVIEW

Swift/xcode/iOS:使用 Firebase 检索已收集的数据并将其显示在单独的视图控制器中

如何从firebase数据库中检索数据作为字符串而不是字典并将其添加到数组中?

从 Firebase 数据库中检索用户数据并显示在用户配置文件文本字段中

如何从firebase直接检索数据到应用程序中?

从 Firebase 检索位置并将标记放在谷歌地图上