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
,就像在我更新的答案中一样。它现在起作用了吗?