addValueEventListener带来任何内容

时间:2018-02-13 19:57:30

标签: android firebase-realtime-database

我对Firebase方法有一些问题 addValueEventListner()。 我的代码应该从我的数据库中向我发送用户消息并在名为 conversa 的ListView中显示它,但它没有得到任何回复。

调试代码时,它没有输入新的ValeuEventListener(...) getView(),尽管getView工作正常。

我用Mensagem本地对象制作了一个填充ArrayList的teste,它可以工作。

任何人都知道我搞砸了哪里?

对话活动:

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);
<...> 
}

消息适配器:

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&#34; menagens&#34;分支就像 - 添加了.push():

 mensagens
      id_remente
          id_destinatario
                mensagem_object
                mensagem_object
                ....

1 个答案:

答案 0 :(得分:0)

由于您正在创建和使用ArrayListMensagemAdapter外部onDataChange()方法,这意味着在创建时您没有完成从中获取数据数据库。 onDataChange()方法具有异步行为,这意味着甚至在您尝试将Mensagem类的对象添加到mensagens列表之前就会调用它。一个快速的解决方案是在ArrayList方法中同时声明MensagemAdapteronDataChange()。您还需要在该方法中设置适配器。如果您想在外面使用该列表,则需要创建自己的回调,为此,我建议您从 slice9 component 中查看我的答案的最后一部分。