0

I'm having some problem with Firebase method addValueEventListner(). My code should bring me user messages from my database and show it in a ListView called conversa, but it's not getting anything back.

Debugging the code, it did not enter in new ValeuEventListener(...) and getView() neither, although getView is working fine.

I made a teste filling the ArrayList with Mensagem local objetcs and it works.

Anyone knows where am I messing up?

The conversation activity:

public class ConversaActivity extends AppCompatActivity {

<...>

    mensagens = new ArrayList<>();
    adapter = new MensagemAdapter(
            ConversaActivity.this,
            mensagens);
    conversa.setAdapter(adapter);

    //Buscando todas as mensagens
    firebase = ConfigFirebase.getFirebase();
    firebase.child("mensagem").child(id_remetente).child(id_destinatario);

    //Listener para as mensagens
    valueEventListenerMensagem = new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {

            mensagens.clear();

            for(DataSnapshot dados: dataSnapshot.getChildren()) {
                Mensagem mensagem_recuperada = dados.getValue(Mensagem.class);
                mensagens.add(mensagem_recuperada);
            }
            adapter.notifyDataSetChanged();
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    };

    firebase.addValueEventListener(valueEventListenerMensagem);
<...> 
}

The messages adapter:

public class MensagemAdapter extends ArrayAdapter<Mensagem> {

private Context context;
private ArrayList<Mensagem> mensagens;

public MensagemAdapter(Context c, ArrayList<Mensagem> objects) {
    super(c, 0, objects);
    this.context = c;
    this.mensagens = objects;
}

@Override
public View getView(int position, @Nullable View convertView, ViewGroup parent) {

    View view = null;

    if(mensagens != null) {
        Preferencias preferencias = new Preferencias(context);
        String id_remetente = preferencias.getIdentificador();

        //Inicializando metódo que traz o layout
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(context.LAYOUT_INFLATER_SERVICE);

        Mensagem mensagem_index = mensagens.get(position);

        if(id_remetente.equals(mensagem_index.getIdUsuario())) {
            view = inflater.inflate(R.layout.item_mensagem_enviada, parent, false);
            TextView textoMensagem = (TextView) view.findViewById(R.id.id_msg_enviada);
            textoMensagem.setText(mensagem_index.getMensagem());
        } else {
            view = inflater.inflate(R.layout.item_mensagem_recebida, parent, false);
            TextView textoMensagem = (TextView) view.findViewById(R.id.id_msg_recebidas);
            textoMensagem.setText(mensagem_index.getMensagem());
        }

    }

    return view;
}

}

Firebase "mensagens" branchs are like - added with .push():

 mensagens
      id_remente
          id_destinatario
                mensagem_object
                mensagem_object
                ....
Taylon Assis
  • 332
  • 1
  • 6
  • 16

1 Answers1

0

It's not getting anything back because you are creating and using your ArrayList and MensagemAdapter outside onDataChange() method which means that by the time at their creation you did not finish getting the data from the database. onDataChange() method has an asynchronous behaviour which means that is called even before your are trying to add those object of Mensagem class to the mensagens list. A quick solution would be to declare both, the ArrayList and MensagemAdapter inside onDataChange() method. Also you need to set the adapter inside that method. If you want to use that list outside, you need to create your own callback and for that I recommend you see the last part of my answer from this post.

Alex Mamo
  • 130,605
  • 17
  • 163
  • 193