这不是重复项。 我正在尝试访问Firebase中一个孩子中的一个孩子,然后将该孩子放入回收站适配器中。它不会显示在回收站适配器中。这里也有类似的问题,但是在实施时仍然无法正常工作。
当前使用适配器,消息对象和片段。
JsonProperty
Fragment Activity
private ArrayList<Messages> results = new ArrayList<>();
private void listenForChat() {
final DatabaseReference userDb = FirebaseDatabase.getInstance().getReference().child("users").child(currentUid)
.child("receivedMessages");
messageUrlDb = userDb.child("messageUrl");
messageUrlDb.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
String message = "";
if (dataSnapshot.child("messageUrl").getValue() != null)
message = dataSnapshot.child("messageUrl").getValue().toString();
Messages obj = new Messages(message, name, image);
if (!results.contains(obj)) {
results.add(obj);
messagesList.setAdapter(mAdapter);
mAdapter.notifyDataSetChanged();
initializeDisplay();
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) { }
});
}
我正在尝试访问(messageUrl)用户-> receiveMessages-> messageUrl。但是,由于有一个键,我认为它不像messagesUrl那样远。对于回收站适配器,它需要将messagesUrl作为字符串接收并进行相应的更新,但我做不到。
如果需要更多代码,我可以发布。谢谢。
答案 0 :(得分:2)
这就是您附加ValueEventListener
的方式:
final DatabaseReference userDb = FirebaseDatabase.getInstance().getReference().child("users").child(currentUid)
.child("receivedMessages");
messageUrlDb = userDb.child("messageUrl");
messageUrlDb.addValueEventListener(new ValueEventListener() {
如果我们从这段代码中获取路径,则您会将侦听器附加到/users/$uid/receivedMessages/messageUrl
。您显示的数据中不存在此路径,因此您的onDataChanged
将被调用,并带有一个空快照。
如果您想为用户阅读所有消息,则应将侦听器附加到/users/$uid/receivedMessages
并在onDataChanged
内解析快照:
final DatabaseReference userDb = FirebaseDatabase.getInstance().getReference().child("users").child(currentUid)
.child("receivedMessages");
userDb.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot userMessages: dataSnapshot.getChildren()) {
for (DataSnapshot messageSnapshot: userMessages.getChildren()) {
System.out.println(messageSnapshot.getKey()+": "+messageSnapshot.getChild("messageUrl").getValue(String.class));
}
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
throw databaseError.toException(); // don't ignore errors
}
});
这会循环遍历用户receivedMessages
节点下的两个子节点。