gpt4 book ai didi

java - Android:使用两个 ValueEventListener 从 firebase 数据库获取数据(在 Arraylist 过期之前设置适配器)

转载 作者:行者123 更新时间:2023-11-29 18:43:13 27 4
gpt4 key购买 nike

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

  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() 具有异步行为。请参阅 here 模式详情。

关于java - Android:使用两个 ValueEventListener 从 firebase 数据库获取数据(在 Arraylist 过期之前设置适配器),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52568977/

27 4 0