我有一个应用程序,它涉及消息传递,它发送并显示得很好,但是它在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);
chatList.add(chat);
Log.e("Chat username: ", "" + chat_username);
Log.e("Chat message: ", "" + chat_msg);
}
adapter.notifyDataSetChanged();
}
我的聊天列表适配器:
public class chatListAdapter extends ArrayAdapter<Chat> {
private Context mContext;
int mResource;
TextView usernameTV, messageTV;
public chatListAdapter(Context context, int resource, ArrayList<Chat> objects) {
super(context, resource, objects);
mContext = context;
mResource = resource;
}
@NonNull
@Override
public View getView(int position, View convertView, ViewGroup parent) {
String username = getItem(position).getUsername();
String message = getItem(position).getMessage();
Chat chat = new Chat(username, message);
LayoutInflater inflater = LayoutInflater.from(mContext);
convertView = inflater.inflate(mResource, parent, false);
usernameTV = convertView.findViewById(R.id.username_chat);
messageTV = convertView.findViewById(R.id.message_chat);
usernameTV.setText(username);
messageTV.setText(message);
return convertView;
}
}
聊天模型:
public class Chat {
private String username, message;
public Chat(String username, String message) {
this.username = username;
this.message = message;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
谢谢您的帮助!
插件:
我的事件监听器:
chatURLRoot.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
chatList.clear();
append_chat_conversation(dataSnapshot);
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
//append_chat_conversation(dataSnapshot);
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
然后,每当发送一条消息时,它都会调用此方法:
public String chat_msg, chat_username;
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);
chatList.add(chat);
Log.e("Chat username: ", "" + chat_username);
Log.e("Chat message: ", "" + chat_msg);
}
adapter.notifyDataSetChanged();
}
答案 0 :(得分:0)
您必须先清除列表,然后再添加如下所示的新DataSnapshot
private void append_chat_conversation(DataSnapshot dataSnapshot) {
chatList.clear();
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);
}
adapter.notifyDataSetChanged();
}