Java Firebase的ListView聊天信息

Java Firebase的ListView聊天信息,java,android,firebase,listview,firebase-realtime-database,Java,Android,Firebase,Listview,Firebase Realtime Database,我创建了一个与其他人聊天的应用程序,为了使聊天活动更美观,我创建了一个ListView来更改每条消息的用户界面。当我发送一条消息时,第一条消息会正确显示,但如果我发送另一条消息,它会覆盖列表视图中的前一条消息,而不仅仅是向列表视图添加另一个值,以下是我的代码: 聊天室: private void append_chat_conversation(DataSnapshot dataSnapshot) { for (DataSnapshot ds : dataSnapshot.get

我创建了一个与其他人聊天的应用程序,为了使聊天活动更美观,我创建了一个
ListView
来更改每条消息的用户界面。当我发送一条消息时,第一条消息会正确显示,但如果我发送另一条消息,它会覆盖列表视图中的前一条消息,而不仅仅是向列表视图添加另一个值,以下是我的代码:

聊天室:

private void append_chat_conversation(DataSnapshot dataSnapshot) {
        for (DataSnapshot ds : dataSnapshot.getChildren()) {
            Log.e("Chat details: ", String.valueOf(ds));
            chat_username = dataSnapshot.child("username").getValue(String.class);
            chat_msg = dataSnapshot.child("message").getValue(String.class);

            Chat chat = new Chat(chat_username, chat_msg);
            ArrayList<Chat> chatList = new ArrayList<>();
            chatList.add(chat);

            chatListAdapter adapter = new chatListAdapter(this, R.layout.chat_message, chatList);
            mListView.setAdapter(adapter);
            Log.e("Chat username: ", "" + chat_username);
            Log.e("Chat message: ", "" + chat_msg);

        }
}

由于数组列表和adpater在顶部是一个公共变量,因此它仍然会显示两次消息。我还需要找到解决办法。感谢您的帮助

您可以使用FirebaseListAdapter显示来自firebase的消息,并对列表中的消息应用自定义布局

    FirebaseDatabase database = FirebaseDatabase.getInstance();
    Query messages = database.getReference("chatrooms").child(sessionId).child("messages");

    FirebaseListOptions<Message> options = new FirebaseListOptions.Builder<Message>().setQuery(messages, Message.class).setLayout(R.layout.message).build();

    ListView messageList = chatActivity.findViewById(R.id.message_list);
    adapter = new FirebaseListAdapter<Message>(options){
        @Override
        protected void populateView(View v, Message model, int position) {
            // Get references to the views of message.xml
            TextView messageText = v.findViewById(R.id.message_text);
            TextView messageUser = v.findViewById(R.id.message_user);
            TextView messageTime = v.findViewById(R.id.message_time);

            // Set their text
            messageText.setText(model.getMessageBody());
            messageUser.setText(model.getUser());

            // Format the date before showing it
            messageTime.setText(DateFormat.format("dd-MM-yyyy (HH:mm:ss)",
                    model.getTime()));
        }
    };

    messageList.setAdapter(adapter);
    adapter.startListening();
FirebaseDatabase=FirebaseDatabase.getInstance();
查询消息=database.getReference(“聊天室”).child(sessionId).child(“消息”);
FirebaseListOptions=new FirebaseListOptions.Builder().setQuery(messages,Message.class).setLayout(R.layout.Message).build();
ListView messageList=chatActivity.findViewById(R.id.message\u列表);
适配器=新FirebaseListAdapter(选项){
@凌驾
受保护的void populateView(视图v、消息模型、int位置){
//获取对message.xml视图的引用
TextView messageText=v.findviewbyd(R.id.message\u text);
TextView messageUser=v.findviewbyd(R.id.message\u user);
TextView messageTime=v.findviewbyd(R.id.message\u time);
//设置他们的文本
messageText.setText(model.getMessageBody());
messageUser.setText(model.getUser());
//在显示日期之前格式化日期
messageTime.setText(DateFormat.format(“dd-MM-yyyy(HH:MM:ss)”,
model.getTime());
}
};
messageList.setAdapter(适配器);
adapter.startListening();

请参阅此处的详细信息:

您可以使用FirebaseListAdapter显示来自firebase的消息,并对列表中的消息应用自定义布局

    FirebaseDatabase database = FirebaseDatabase.getInstance();
    Query messages = database.getReference("chatrooms").child(sessionId).child("messages");

    FirebaseListOptions<Message> options = new FirebaseListOptions.Builder<Message>().setQuery(messages, Message.class).setLayout(R.layout.message).build();

    ListView messageList = chatActivity.findViewById(R.id.message_list);
    adapter = new FirebaseListAdapter<Message>(options){
        @Override
        protected void populateView(View v, Message model, int position) {
            // Get references to the views of message.xml
            TextView messageText = v.findViewById(R.id.message_text);
            TextView messageUser = v.findViewById(R.id.message_user);
            TextView messageTime = v.findViewById(R.id.message_time);

            // Set their text
            messageText.setText(model.getMessageBody());
            messageUser.setText(model.getUser());

            // Format the date before showing it
            messageTime.setText(DateFormat.format("dd-MM-yyyy (HH:mm:ss)",
                    model.getTime()));
        }
    };

    messageList.setAdapter(adapter);
    adapter.startListening();
FirebaseDatabase=FirebaseDatabase.getInstance();
查询消息=database.getReference(“聊天室”).child(sessionId).child(“消息”);
FirebaseListOptions=new FirebaseListOptions.Builder().setQuery(messages,Message.class).setLayout(R.layout.Message).build();
ListView messageList=chatActivity.findViewById(R.id.message\u列表);
适配器=新FirebaseListAdapter(选项){
@凌驾
受保护的void populateView(视图v、消息模型、int位置){
//获取对message.xml视图的引用
TextView messageText=v.findviewbyd(R.id.message\u text);
TextView messageUser=v.findviewbyd(R.id.message\u user);
TextView messageTime=v.findviewbyd(R.id.message\u time);
//设置他们的文本
messageText.setText(model.getMessageBody());
messageUser.setText(model.getUser());
//在显示日期之前格式化日期
messageTime.setText(DateFormat.format(“dd-MM-yyyy(HH:MM:ss)”,
model.getTime());
}
};
messageList.setAdapter(适配器);
adapter.startListening();

请参阅此处的详细信息:

尝试按如下方式重新排列:

private void append_chat_conversation(DataSnapshot dataSnapshot) {
    ArrayList<Chat> chatList = new ArrayList<>();
    for (DataSnapshot ds : dataSnapshot.getChildren()) {
        Log.e("Chat details: ", String.valueOf(ds));
        chat_username = dataSnapshot.child("username").getValue(String.class);
        chat_msg = dataSnapshot.child("message").getValue(String.class);

        Chat chat = new Chat(chat_username, chat_msg);
        chatList.add(chat);
        Log.e("Chat username: ", "" + chat_username);
        Log.e("Chat message: ", "" + chat_msg);
    }
    chatListAdapter adapter = new chatListAdapter(this, R.layout.chat_message, chatList);
    mListView.setAdapter(adapter);
}
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference keyRef = rootRef.child("matches").child("1").child("-LluNpbfFgzFclI7cdAS").child("messages");

试着像这样重新安排:

private void append_chat_conversation(DataSnapshot dataSnapshot) {
    ArrayList<Chat> chatList = new ArrayList<>();
    for (DataSnapshot ds : dataSnapshot.getChildren()) {
        Log.e("Chat details: ", String.valueOf(ds));
        chat_username = dataSnapshot.child("username").getValue(String.class);
        chat_msg = dataSnapshot.child("message").getValue(String.class);

        Chat chat = new Chat(chat_username, chat_msg);
        chatList.add(chat);
        Log.e("Chat username: ", "" + chat_username);
        Log.e("Chat message: ", "" + chat_msg);
    }
    chatListAdapter adapter = new chatListAdapter(this, R.layout.chat_message, chatList);
    mListView.setAdapter(adapter);
}
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference keyRef = rootRef.child("matches").child("1").child("-LluNpbfFgzFclI7cdAS").child("messages");

要解决此问题,只需使用以下代码行:

private void append_chat_conversation(DataSnapshot dataSnapshot) {
        ArrayList<Chat> chatList = new ArrayList<>();
        for (DataSnapshot ds : dataSnapshot.getChildren()) {
            chatList.add(ds.getValue(Chat.class));
        }
        chatListAdapter adapter = new chatListAdapter(this, R.layout.chat_message, chatList);
        mListView.setAdapter(adapter);
}

要解决此问题,只需使用以下代码行:

private void append_chat_conversation(DataSnapshot dataSnapshot) {
        ArrayList<Chat> chatList = new ArrayList<>();
        for (DataSnapshot ds : dataSnapshot.getChildren()) {
            chatList.add(ds.getValue(Chat.class));
        }
        chatListAdapter adapter = new chatListAdapter(this, R.layout.chat_message, chatList);
        mListView.setAdapter(adapter);
}


非常感谢,我会给它一个goI尝试像你说的那样重新排列,消息现在在列表视图中出现两次,然后如果我添加另一条消息,它会再次被覆盖,但再次显示两次。谢谢,我会尝试一下,我需要for循环,不是吗?非常感谢,我会给它一个goI尝试像你说的那样重新排列,消息现在在列表视图中出现两次,然后如果我添加另一条消息,它会再次被覆盖,但再次显示两次。谢谢,我会尝试一下,我需要for循环,虽然不是吗?谢谢你的评论我会看一看谢谢你的回答。我一直在努力解决这个问题。我刚刚错过了线路适配器。startListening();谢谢你的评论我会看看谢谢你的回答。我一直在努力解决这个问题。我刚刚错过了线路适配器。startListening();谢谢兄弟的帮助您好,我尝试了您的代码,但出现了以下错误:com.google.firebase.database.DatabaseException:无法将java.lang.String类型的对象转换为com.wasd.opposities.chat类型这意味着您使用了错误的
数据库引用
。请添加您的数据库结构。感谢您的帮助,我非常感谢,数据库引用指向此位置,我将通过图像发送:(每次用户发送消息时,它都会创建一个随机字符串,在该节点中,它包含消息和用户名:在这种情况下,您应该使用数据库引用
keyRef
,就像在我更新的答案中一样。现在可以用了吗?谢谢兄弟的帮助您好,我尝试了您的代码,但出现了以下错误:com.google.firebase.database.DatabaseException:无法将java.lang.String类型的对象转换为com.wasd.opposities.chat类型这意味着您使用了错误的
数据库引用。
。请添加您的数据库结构。感谢您的帮助,我非常感谢,数据库引用指向此位置,我将通过图像发送它:(每次用户发送消息时,它都会创建一个随机字符串,并且在该节点中包含消息和用户名:在这种情况下,您应该使用数据库引用
keyRef
,就像在我更新的答案中一样。它现在起作用了吗?