【发布时间】:2018-08-03 13:14:18
【问题描述】:
我有一个应用程序,它涉及消息传递,它发送和显示非常好,但是它在 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();
}
【问题讨论】:
-
在添加值之前清除您的数组列表。
-
您能进一步解释一下吗?抱歉,我习惯了快速,所以我对此有点陌生:)
-
@NathanEllis,请在 for (DataSnapshot ds : dataSnapshot.getChildren()) 行上方添加
chatList.clear();并检查。 -
@NathanEllis,您使用哪个
ValueEventListener来获取addValueEventListener或addListenerForSingleValueEvent之类的值? -
@NiravBhavsar 它是一个 addChildEventListener,因为它总是必须不断地监听更多的新消息?
标签: java android listview firebase-realtime-database adapter