【问题标题】:Android: getting datas with two ValueEventListener from firebase database (setting adapter before Arraylist Expires)Android:从 firebase 数据库中获取带有两个 ValueEventListener 的数据(在 Arraylist Expires 之前设置适配器)
【发布时间】:2018-09-29 13:47:39
【问题描述】:

我正在开发一个应用程序,并且在数据库中有医生和患者等用户。患者数据中可能有医生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 是空的。我该如何解决这个问题?

【问题讨论】:

    标签: java android firebase firebase-realtime-database android-recyclerview


    【解决方案1】:

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

    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模式详情。

    【讨论】:

    • 我试过了,但有一个问题:患者正在拍摄伤口照片并在每张照片后更新照片总数。以这种方式添加新照片时,同一患者的 4 条数据会显示在回收站视图中。
    • 如何解决这个问题 Alex?
    • 让我们一次只回答一个问题。使用我上面的代码,你的RecyclerView 还是空的吗?
    • 不,代码正在运行。 RecyclerView 中有患者。
    • 我们可以通过第二个问题或发布一个新主题吗?
    【解决方案2】:

    你需要:

    1. 将以下行移动到顶部外部 onDataChange()。

      PatientSelectionAdapter adapter= new PatientSelectionAdapter(getContext(),name,sicks,hastauid);
      
    2. 在从内部 onDataChange() 返回之前插入以下行

      adapter.notifyDataSetChanged();
      

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-08-13
      • 1970-01-01
      • 2017-03-09
      • 1970-01-01
      • 1970-01-01
      • 2017-03-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多