Android 访问子firebase中的子级

Android 访问子firebase中的子级,android,firebase,firebase-realtime-database,Android,Firebase,Firebase Realtime Database,这不是复制品。 我正在尝试访问firebase中一个子系统中的一个子系统,然后将该子系统放入回收器适配器。它不会显示在回收器适配器中。这里有一个与此类似的问题,但在实现它时,它仍然不起作用 当前正在使用适配器、消息对象和片段 Fragment Activity private ArrayList<Messages> results = new ArrayList<>(); private void listenForChat() { fi

这不是复制品。 我正在尝试访问firebase中一个子系统中的一个子系统,然后将该子系统放入回收器适配器。它不会显示在回收器适配器中。这里有一个与此类似的问题,但在实现它时,它仍然不起作用

当前正在使用适配器、消息对象和片段

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

片段活动
private ArrayList results=new ArrayList();
私有void listenForChat(){
final DatabaseReference userDb=FirebaseDatabase.getInstance().getReference().child(“用户”).child(当前UID)
.儿童(“收到的信息”);
messageUrlDb=userDb.child(“messageUrl”);
messageUrlDb.addValueEventListener(新的ValueEventListener(){
@凌驾
公共void onDataChange(DataSnapshot DataSnapshot){
字符串消息=”;
if(dataSnapshot.child(“messageUrl”).getValue()!=null)
message=dataSnapshot.child(“messageUrl”).getValue().toString();
Messages obj=新消息(消息、名称、图像);
如果(!results.contains(obj)){
结果:添加(obj);
messagesList.setAdapter(mAdapter);
mAdapter.notifyDataSetChanged();
初始化显示();
}
}
@凌驾
已取消的公共void(@NonNull DatabaseError DatabaseError){}
});
}
公共类ChatAdapter扩展了RecyclerView.Adapter{
私人传道者名单;
私有列表用户列表;
私人语境;
私有DisplayTextFragment DisplayTextFragment;
私有字符串消息;
公共聊天适配器(列表mMessageList,上下文){
this.mMessageList=mMessageList;
this.context=上下文;
}
@凌驾
public ChatViewHolder onCreateViewHolder(视图组父级,int-viewType){
视图v=LayoutInflater.from(parent.getContext()).flate(R.layout.message\u布局,null);
ChatViewHolders rcv=新的ChatViewHolders(v);
返回rcv;
}
@凌驾
公共无效onBindViewHolder(最终ChatViewHolder,内部位置){
holder.messageText.setText(mMessageList.get(position.getMessage());
}
@凌驾
public int getItemCount(){
返回mMessageList.size();
}
公共类ChatViewHolder扩展了RecyclerView.ViewHolder{
public text查看messageText、timeSent、mName;
ImageView文件;
线性布局mLayout;
公共聊天室视图持有者(视图){
超级(视图);
messageText=(TextView)view.findViewById(R.id.message\u text);
mLayout=itemView.findviewbyd(R.id.layout);
}
}
}

我正在尝试访问(messageUrl)用户->接收消息->messageUrl。然而,由于有一把钥匙,我认为它没有messagesUrl那么远。对于recycler适配器,它需要将messagesUrl作为字符串接收并相应地更新,但我就是做不到


如果需要更多的代码,我可以发布。谢谢。

这就是您如何附加您的
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
节点下的两级子节点上循环。

这就是如何附加
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
节点下的两级子节点上循环