从 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数据库中检索数据作为字符串而不是字典并将其添加到数组中?