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