Home > Back-end >  retrieve the value of an ArrayList inside a repeating function
retrieve the value of an ArrayList inside a repeating function

Time:12-23

I'm trying to retrieve the array list generated in the function recuperarPessoasModelo(), but it only runs much later than I need so the value passed to revelaPessoas() is null, does anyone know any way I can run this function and just get the value after recuperarPessoasModelo() is executed? I can't put it inside because since it has a for loop it will run X times and generate a repeating list

The .Json in the DB looks like this:

Perfil{
       PcCPoh01wscJj7jJBQQorme7Rqq1{
                                    status:online
                                    name: Carl Johnson
                                    age: 21 
                                    sex: male}
       t3IeEKy7XxdGeLYRxw2G1djNHdp2{
                                    status:online
                                    name: John Marston
                                    age: 33 
                                    sex: male}
}
Requisicoes{
 t3IeEKy7XxdGeLYRxw2G1djNHdp2{
                             Enviadas{
                                     PcCPoh01wscJj7jJBQQorme7Rqq1{
                                                             idPessoa:PcCPoh01wscJj7jJBQQorme7Rqq1
                                                             status: Aguardando
                                                                 }
                                     }
                              }
}
                                                                 

the class in question:

public class Perfil_outter extends AppCompatActivity{

    private List <RequisicoesCitty> requisicao = new ArrayList<>();
    private List <ModeloPerfil> pessoaQuestao = new ArrayList<>();
    private String idComp;

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
     
     carregarIds();
     revelaPessoa()
    }

    public List<ModeloPerfil> getPessoaQuestao() {
        return pessoaQuestao;
    }

    public void setPessoaQuestao(List<ModeloPerfil> pessoaQuestao) {
        this.pessoaQuestao = pessoaQuestao;
    }

    public void carregarIds(){
        Log.d("Part 1", "Working");

        DatabaseReference firebaseRef = ConfiguracaoFirebase.getFirebaseDatabase();
        DatabaseReference idsRef = firebaseRef.child("Requisicoes");
        Query refId = idsRef.child(usuarioAtual.getId()).child("Enviadas").orderByChild("id");
        refId.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {


                for(DataSnapshot ds: snapshot.getChildren()) {
                    RequisicoesCitty reqSnapshots = ds.getValue(RequisicoesCitty.class);
                    Log.d("IdPessoas",reqSnapshots.getIdPessoa());
                    requisicao.add(reqSnapshots);
                }
                carregarRequisicoes();
            }

            @Override
            public void onCancelled(@NonNull DatabaseError error) {

            }
        });
    }

    public void carregarRequisicoes(){

        if(requisicao.isEmpty()){
            Log.d("Não encontrado", "Nenhuma requisição Citty");
        }

        for(RequisicoesCitty requisicao: requisicao) {
            Log.d("Part 2", "Working");
            DatabaseReference firebaseRef = ConfiguracaoFirebase.getFirebaseDatabase();
            Query requisicoesEnviadas = firebaseRef.child("Requisicoes").child(usuarioAtual.getId())
                    .child("Enviadas").child(requisicao.getIdPessoa());

            requisicoesEnviadas.addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot snapshot) {
                    RequisicoesCitty reqSnap = snapshot.getValue(RequisicoesCitty.class);
                    idComp = reqSnap.getIdPessoa();
                    recuperarPessoasModelos();
                }

                @Override
                public void onCancelled(@NonNull DatabaseError error) {

                }
            });
        }
    }



    public void recuperarPessoasModelos(){
        Log.d("Part 3", "Working");

        DatabaseReference firebaseRef = ConfiguracaoFirebase.getFirebaseDatabase();
        Query pessoas = firebaseRef.child("Perfil").child(idComp);
        pessoas.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {

                ModeloPerfil pessoas = snapshot.getValue(ModeloPerfil.class);
                pessoaQuestao.add(pessoas);
                setPessoaQuestao(pessoaQuestao);
            }

            @Override
            public void onCancelled(@NonNull DatabaseError error) {

            }
        });
    }

    public void revelaPessoas(){

        for(ModeloPerfil modelo: getPessoaQuestao()){
            Log.d("Funcionar", modelo.getNome());
        }
    }
}

did you understand my problem? my goal is to get the value modelo.getNome() inside of revelaPessoas back and display but it runs sooner than it should

CodePudding user response:

You're calling recuperarPessoasModelos each time that carregarRequisicoes loops through one of its for(RequisicoesCitty requisicao: requisicao) {. This is totally fine, but I'm guessing that recuperarPessoasModelos is not handling these multiple calls correctly.

If you only want to call recuperarPessoasModelos once all requisicao are done, you can check a counter like this:

List snapshots = new List(); //            
  • Related