Исключение из-за нулевого указателя при извлечении данных Firebase - PullRequest
0 голосов
/ 01 ноября 2018

Код

        DatabaseReference mFetchingMessages = FirebaseDatabase.getInstance().getReference().child("Messages").child(MessageSenderId).child(MessageRecieverId);


     FirebaseRecyclerOptions<MessagesHelper> options =
            new FirebaseRecyclerOptions.Builder<MessagesHelper>()
                    .setQuery(mFetchingMessages, MessagesHelper.class)
                    .build();

firebaseRecyclerAdapter = new FirebaseRecyclerAdapter<MessagesHelper, Chat.MessagesViewHolder>(options) {

        @Override
        protected void onBindViewHolder(@NonNull final Chat.MessagesViewHolder holder, final int position, @NonNull MessagesHelper model) {
            holder.setMessage(model.getMessage());
            final String from_user = model.getFrom();
            final boolean Seen = model.isSeen();

            final String userId = getRef(position).getKey();
            DatabaseReference mTimeReference = FirebaseDatabase.getInstance().getReference().child("Messages").child(MessageSenderId).child(MessageRecieverId);
            mTimeReference.keepSynced(true);
            mTimeReference.addChildEventListener(new ChildEventListener() {
                @Override
                public void onChildAdded(DataSnapshot dataSnapshot, String s) {
                    for (DataSnapshot postSnapshot: dataSnapshot.getChildren()) {
                        String message = postSnapshot.child("Message").getValue().toString();

                        if (from_user != null && from_user.equals(MessageSenderId)) {
                            holder.mDisplayMessage.setBackgroundColor(Color.BLUE);
                            holder.mDisplayMessage.setBackgroundColor(Color.WHITE);

                            RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) holder.mDisplayMessage.getLayoutParams();
                            params.removeRule(RelativeLayout.ALIGN_PARENT_LEFT);
                            params.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
                            holder.mDisplayMessage.setLayoutParams(params);

                            if (Seen == true) {
                                holder.mDisplayMessage.setBackgroundColor(Color.CYAN);
                            } else {
                                holder.mDisplayMessage.setBackgroundColor(Color.BLUE);
                            }
                        } else {
                            holder.mDisplayMessage.setBackgroundColor(Color.GREEN);
                            holder.mDisplayMessage.setTextColor(Color.BLACK);

                            RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) holder.mDisplayMessage.getLayoutParams();
                            params.removeRule(RelativeLayout.ALIGN_PARENT_RIGHT);
                            params.addRule(RelativeLayout.ALIGN_PARENT_LEFT);
                            holder.mDisplayMessage.setLayoutParams(params);
                        }

                        holder.setMessage(message);
                        linearLayoutManager.setStackFromEnd(true);

                    }

                }

                @Override
                public void onChildChanged(DataSnapshot dataSnapshot, String s) {
                }

                @Override
                public void onChildRemoved(DataSnapshot dataSnapshot) {
                }

                @Override
                public void onChildMoved(DataSnapshot dataSnapshot, String s) {
                }

                @Override
                public void onCancelled(DatabaseError databaseError) {
                }
            });
        }
        @Override
        public Chat.MessagesViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            View view = LayoutInflater.from(parent.getContext())
                    .inflate(R.layout.custom_activity_chat, parent, false);
            return new Chat.MessagesViewHolder(view);
        }
    };
    messageList.setAdapter(firebaseRecyclerAdapter);

 public static class MessagesViewHolder extends RecyclerView.ViewHolder {
    View mView;
    TextView mDisplayMessage;
    public MessagesViewHolder(View itemView) {
        super(itemView);
        mView = itemView;
    }
    public void setMessage(String message) {
        mDisplayMessage = (TextView) mView.findViewById(R.id.message_text_layout);
        mDisplayMessage.setText(String.valueOf(message));
    }
    public void setFrom(String from) {
    }
}

Если я удаляю цикл, он будет извлекать только последнее сообщение ... Как и все представления, будет отображаться только последнее сообщение, и если я добавлю цикл, я получаю исключение nullpointer в строке String message = postsnapshot.child (" Сообщение ")

enter image description here

Во-первых, это идентификатор отправителя внутри сообщений и внутри, который является идентификатором получателя, и внутри, который является push-идентификатором

1 Ответ

0 голосов
/ 01 ноября 2018

Вы можете добавить эту строку в свой код, чтобы проверить, есть ли у вас Message ребенок, а затем забрать его.

Похоже, у некоторых узлов нет Message дочернего элемента. Вы можете проверить это перед загрузкой Message.

if (postSnapshot.hasChild("Message")) {
     String message = postSnapshot.child("Message").getValue().toString();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...