【问题标题】:My app only gets the first message i send then stops displaying other nodes我的应用程序只收到我发送的第一条消息,然后停止显示其他节点
【发布时间】:2019-08-22 20:58:33
【问题描述】:

我正在使用firebase将消息存储在随机生成的节点下,消息已成功添加到该节点,但它只显示发送的第一条消息。

这是我的包含监听器的类。

我尝试将获取聊天ID中的Single事件监听器更改为值事件监听器,但没有解决问题。

当我关闭聊天并再次打开它时,它只显示第一条消息。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_chat);
    currentUserId = FirebaseAuth.getInstance().getCurrentUser().getUid();
    mMatchId = getIntent().getExtras().getString("MatchId");


    mDatabaseUser = FirebaseDatabase.getInstance().getReference().child("Users").child(currentUserId).child("connections").child("matches").child(mMatchId).child("ChatId");
    mDatabaseChat = FirebaseDatabase.getInstance().getReference().child("Chat");

    getChatId();

    mRecyclerView = (RecyclerView) findViewById(R.id.recyclerView);
    mRecyclerView.setNestedScrollingEnabled(false);
    mRecyclerView.setHasFixedSize(false);

    mChatLayoutManager = new LinearLayoutManager(ChatActivity.this);
    mRecyclerView.setLayoutManager(mChatLayoutManager);
    mChatAdapter = new ChatAdapter(getDataSetChat(), ChatActivity.this);
    mRecyclerView.setAdapter(mChatAdapter);

    mSendEditText = (EditText) findViewById(R.id.message);
    mSendButton = (Button) findViewById(R.id.send);

    mSendButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            sendMessage();
        }
    });

}

private void sendMessage() {

    String sendMessageText = mSendEditText.getText().toString();
    if(!sendMessageText.isEmpty()){
        DatabaseReference newMessageDb = mDatabaseChat.push();
        Map newMessage = new HashMap();

        newMessage.put("createdByUser", currentUserId);
        newMessage.put("text", sendMessageText);

        newMessageDb.setValue(newMessage);

    }
    mSendEditText.setText(null);
}


private void getChatId(){

    mDatabaseUser.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            if(dataSnapshot.exists()){
                chatId = dataSnapshot.getValue().toString();
                mDatabaseChat = mDatabaseChat.child(chatId);
                getChatMessages();
            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

}

private void getChatMessages() {

   mDatabaseChat.addValueEventListener(new ValueEventListener() {
       @Override
       public void onDataChange(DataSnapshot dataSnapshot) {
           if (dataSnapshot.exists()) {
               for (DataSnapshot t : dataSnapshot.getChildren()) {


                   String message = null;
                   String createdByUser = null;
                   if (t.child("text").getValue() != null) {
                       message = t.child("text").getValue().toString();
                   }
                   if (t.child("createdByUser").getValue() != null) {
                       createdByUser = t.child("createdByUser").getValue().toString();
                   }

                   if (message != null && createdByUser != null) {
                       Boolean currentUserBoolean = false;
                       if (createdByUser.equals(currentUserId)) {
                           currentUserBoolean = true;
                       }

                       ChatObject newMessage = new ChatObject(message, currentUserBoolean);
                       resultChat.add(newMessage);
                       mChatAdapter.notifyDataSetChanged();
                   }
               }
           }
       }

       @Override
       public void onCancelled(DatabaseError databaseError) {

       }
   });
}

Database image

【问题讨论】:

  • 您确定只收到一条消息吗?记录 chid 添加的方法,我没有看到您的代码有问题....也许您的项目布局具有高度匹配父级....只是看到...尝试滚动,如果它具有高度匹配父级它将不可见

标签: java android firebase firebase-realtime-database


【解决方案1】:

这是因为您第一次打开活动并且您的 getChatId() 函数被调用一次,并为您提供单个消息的单个 id。然后将它传递给 addChildEventListener。所以这就是它给你的recyclerview的单一messagr。如果您显示您的数据库架构,我将为您提供更具体的查询

  List<Chat> chatMessageList = new ArrayList<>();; 
    DatabaseReference database = FirebaseDatabase.getInstance()
            .getReference()
            .child(Common.CHATS);

    database.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            chatMessageList.clear();
            for (DataSnapshot snapshot : dataSnapshot.getChildren()) {
                Chat chat = snapshot.getValue(Chat.class);
                assert chat != null;
                    chatMessageList.add(chat);


                 mChatAdapter = new ChatAdapter(context, chatMessageList);
                 mRecyclerView.setAdapter(mChatAdapter);

            }
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    });

【讨论】:

  • 我添加了一个数据库图像。在节点“聊天”下,我有一个节点,指示两个用户之间的连接,在该节点下存在该连接中可用的所有消息。我到底应该改变什么?
  • 我修改了获取消息的方法,它仍然只显示第一条消息。
  • 还有一点 recyclerView.setHasFixedSize(true);
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-08
  • 1970-01-01
  • 2013-10-09
  • 1970-01-01
相关资源
最近更新 更多