当前位置: 首页 > 面试题库 >

Android:从Firebase数据库获取带有两个ValueEventListener的数据(在Arraylist过期之前设置适配器)

微生新霁
2023-03-14
问题内容

我正在开发一个应用程序,数据库中有像医生和病人这样的用户。患者数据中可能有医生userId,医生数据中可能有患者userId。因为在应用程序中,医生将看到有关其患者的一些信息。我开发了这段代码,但是在设置适配器之前无法将患者信息添加到Arraylist中。这是我的代码:

  myRef.child("users")
            .child(firebaseUser.getUid()).child("patients").addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                for(DataSnapshot ds: dataSnapshot.getChildren()){
                    AddingPatients addingpatient = ds.getValue(AddingPatients.class);

                    if(addingpatient.getConfirm().equals("yes")){

                        myref.child("users").child(addingpatient.getUserId()).addValueEventListener(new ValueEventListener() {
                            @Override
                            public void onDataChange(DataSnapshot dataSnapshot) {
                                if (dataSnapshot.exists()) {
                                    Users patient = dataSnapshot.getValue(Users.class);

                                    name.add(patient.getName()+" "+patient.getSurname());

                                    sicks.add(patient.getSicks());
                                    patientuid.add(patient.getUserId());
                                }

                            }

                            @Override
                            public void onCancelled(DatabaseError error) {
                            }
                        });
                    }
                }

            PatientSelectionAdapter adapter= new PatientSelectionAdapter(getContext(),name,sicks,hastauid);
            rv.setAdapter(adapter);
            rv.setLayoutManager(new LinearLayoutManager(getContext()));

        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {
        }
    });

当我调试代码时,看到的是,设置适配器后,患者信息会添加到列表中。所以我RecyclerView是空的。我该如何解决这个问题?


问题答案:

要解决此问题,请移动以下代码行:

PatientSelectionAdapter adapter= new PatientSelectionAdapter(getContext(),name,sicks,hastauid);
rv.setAdapter(adapter);
rv.setLayoutManager(new LinearLayoutManager(getContext()));

在第二种onDataChange()方法中,如下所示:

myref.child("users").child(addingpatient.getUserId()).addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        if (dataSnapshot.exists()) {
            Users patient = dataSnapshot.getValue(Users.class);

            name.add(patient.getName()+" "+patient.getSurname());

            sicks.add(patient.getSicks());
            patientuid.add(patient.getUserId());
        }
        PatientSelectionAdapter adapter= new PatientSelectionAdapter(getContext(),name,sicks,hastauid);
        rv.setAdapter(adapter);
        rv.setLayoutManager(new LinearLayoutManager(getContext()));
    }

    @Override
    public void onCancelled(DatabaseError error) {}
});

发生这种情况是因为onDataChange()具有异步行为。请在这里查看 模式详细信息。



 类似资料:
  • 我正在寻找一种方法,以数组[]或字符串等格式从Firebase实时数据库获取数据。 我的数据库如下所示:链接到数据库的图像 或者:

  • 我有一个问题,从多个路径从Firebas eDatabase获取数据。我正在编写一个Endomondo克隆,我有一个数据库结构如下: 现在我想在feed选项卡中列出我朋友的所有锻炼。所以要做到这一点,我需要做三件事。 1)遍历我的配置文件(user_1)以获取我所有朋友的ID。 2)当我拥有这些ID时,我需要迭代它们的配置文件以获得它们的名称来显示。 3)遍历锻炼以获得我朋友的所有锻炼。 现在我想

  • 我创建了一个名为的类来从firebase数据库中获取所有用户数据。下面是我用来获取firebase数据(用户名)的方法。 而firebase链接也没有问题。它还提供了用户名。 当我用一些虚拟的预定义字符串数据替换username时,这段代码就可以工作了。但是当我添加用户名时,它会给我以下错误。

  • 问题内容: 我已将用户注册的日期保存为日期时间,例如 2011-12-06 10:45:36 。我已运行此查询,并且希望此项目 -2011-12-06 10: 45 : 36- 将被选择: 但是不是。存在任何优雅的方式,该如何选择?我最初的想法是,但是看起来不太好。 问题答案: 您的问题是日期的简短版本使用午夜作为默认设置。因此,您的查询实际上是: 这就是为什么您看不到10:45的记录的原因。 更

  • 我试图从Firebase数据库中读取数据,我已经到处阅读和查找,但我已经走到了死胡同。 这就是我所做的一切。 依赖项: 实现'com.google.firebase: Firebase存储: 9.2.1' 实现'com。谷歌。firebase:firebase数据库:9.2。1' 实现'com。谷歌。firebase:firebase授权:9.2。1' 实现'com。谷歌。火基:火基核心:9.2。

  • 我有一个带有此模式的数据库: 我测试了这段代码,但我无法从数据库中获得任何消息。我会感谢你的帮助。