Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/386.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/235.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android:从firebase数据库获取具有两个ValueEventListener的数据(在Arraylist过期之前设置适配器)_Java_Android_Firebase_Firebase Realtime Database_Android Recyclerview - Fatal编程技术网

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

Java Android:从firebase数据库获取具有两个ValueEventListener的数据(在Arraylist过期之前设置适配器),java,android,firebase,firebase-realtime-database,android-recyclerview,Java,Android,Firebase,Firebase Realtime Database,Android Recyclerview,我正在开发一个应用程序,数据库中有医生和病人这样的用户。患者数据中可能有医生用户ID,医生数据中可能有患者用户ID。因为应用程序内的医生会看到一些关于他/她的患者的信息。我开发了这段代码,但在设置适配器之前,我无法将患者信息添加到ArrayList中。这是我的密码: myRef.child("users") .child(firebaseUser.getUid()).child("patients").addValueEventListener(new ValueEv

我正在开发一个应用程序,数据库中有医生和病人这样的用户。患者数据中可能有医生用户ID,医生数据中可能有患者
用户ID
。因为应用程序内的医生会看到一些关于他/她的患者的信息。我开发了这段代码,但在设置适配器之前,我无法将患者信息添加到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()
具有异步行为。请参阅模式详细信息。

您需要:

  • 将以下行移到顶部外部onDataChange()

  • 在从内部onDataChange()返回之前插入以下行


  • 我试过了,但有个问题:患者正在拍摄伤口照片,并在每张照片后更新照片总数。当这是添加新照片的方式时,相同患者的4个数据将显示在“回收器”视图中。如何解决该问题Alex?让我们一次只回答一个问题。使用我上面的代码,您的
    RecyclerView
    是否仍然为空?不,代码正在工作。RecyclerView中有患者。我们可以通过第二个问题还是发布一个新主题?
    PatientSelectionAdapter adapter= new PatientSelectionAdapter(getContext(),name,sicks,hastauid);
    
    adapter.notifyDataSetChanged();