运行updateList()时,它会加载来自Firebase的已输入数据。这是一个聊天应用,因此当有人键入消息时,Firebase会实时更新,也可以。
问题是我得到一个NullPointerException(不应该是这种情况)我创建一个新的Message对象(Message mess = new Mess ....)。为什么我收到这个错误,为什么我尝试的一切都不起作用?
Error = java.lang.NullPointerException:尝试在空对象引用上调用虚方法'java.lang.String java.lang.Object.toString()'。
我尝试了一个锁,一个布尔值,并试图使变量成为全局变量。
public void sendButtonClicked(View view) {
final String messageValue = userMessage.getText().toString().trim();
final String date = "4:20";
final String userName = "Rob";
if (!TextUtils.isEmpty(messageValue)) {
final DatabaseReference newPost = reference.push();
newPost.child("Content").setValue(messageValue);
newPost.child("Date").setValue(date);
newPost.child("userName").setValue(userName);
}
}
private void updateList() {
reference.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
Message mess = new Message(dataSnapshot.child("Content").getValue().toString(), dataSnapshot.child("Date").getValue().toString(),dataSnapshot.child("userName").getValue().toString());
result.add(mess);
adapter.notifyDataSetChanged();
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
Message message = dataSnapshot.getValue(Message.class);
int index = getItemIndex(message);
result.set(index, message);
adapter.notifyItemChanged(index);
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
Message message = dataSnapshot.getValue(Message.class);
int index = getItemIndex(message);
result.remove(index);
adapter.notifyItemRemoved(index);
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
数据在Firebase中的外观快照
答案 0 :(得分:0)
我认为我遇到了类似的问题,弗兰克的回应对我有帮助:https://groups.google.com/forum/#!topic/firebase-talk/-cdTDFBOmMw。
当您在Firebase中创建新记录时,似乎您正在为每个属性分别设置setValue():
newPost.child("Content").setValue(messageValue);
newPost.child("Date").setValue(date);
newPost.child("userName").setValue(userName);
所以正在发生的事情是,可能设置了Date的值,该值立即触发onChildAdded,但是内容仍然丢失。尝试将它们设置为单个消息对象。