Доступ к ребенку на базе детей - PullRequest
0 голосов
/ 25 апреля 2019

Это не дубликат.Я пытаюсь получить доступ к ребенку внутри ребенка в пожарной базе, а затем помещаю его в адаптер утилизатора.Это не будет показано в адаптере утилизатораЗдесь есть схожий вопрос, но при его реализации он все еще не работает.

В настоящее время используется адаптер, объект сообщений и фрагмент.

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

public class ChatAdapter extends RecyclerView.Adapter<ChatAdapter.ChatViewHolders> {


    private List<Messages> mMessageList;
    private List<UserObject> usersList;
    private Context context;
    private DisplayTextFragment displayTextFragment;
    private String message;



    public ChatAdapter(List<Messages> mMessageList, Context context) {

        this.mMessageList = mMessageList;
        this.context = context;

    }

    @Override
    public ChatViewHolders onCreateViewHolder(ViewGroup parent, int viewType) {

        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.message_layout, null);
        ChatViewHolders rcv = new ChatViewHolders(v);
        return rcv;

    }

    @Override
    public void onBindViewHolder(final ChatViewHolders holder, int position) {

        holder.messageText.setText(mMessageList.get(position).getMessage());

    }

    @Override
    public int getItemCount() {
        return mMessageList.size();
    }


    public class ChatViewHolders extends RecyclerView.ViewHolder {

        public TextView messageText, timeSent, mName;
        ImageView mProfile;
        LinearLayout mLayout;

        public ChatViewHolders(View view) {
            super(view);
            messageText = (TextView) view.findViewById(R.id.message_text);
            mLayout = itemView.findViewById(R.id.layout);
        }
    }
}

Firebase database

Я пытаюсь получить доступ (messageUrl) пользователи -> receiveMessages -> messageUrl.Однако, поскольку есть ключ, они предполагают, что это не так, как messagesUrl.Для адаптера утилизатора он должен принимать messagesUrl в виде строки и обновлять соответствующим образом, но я просто не могу этого сделать.

Если потребуется еще какой-либо код, я могу опубликовать.Спасибо.

1 Ответ

2 голосов
/ 25 апреля 2019

Вот как вы прикрепляете свой 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 пользовательским узлом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...