替换 ArrayList 的元素,如果其中已经存在相同值的对象



我正在为我的聊天应用程序使用 socket.io。我有一个包含最后一条消息,用户名,时间的ArrayList。每当新消息以 JSON 格式到达时,它应该检查 JSON 包含的用户名是否存在于 ArrayList 中。如果存在,则更新 ArrayList,否则添加 ArrayList。 这是我的代码:-

private Emitter.Listener handle1 = new Emitter.Listener() {
@Override
public void call(final Object... args) {
ChatLists.this.runOnUiThread(new Runnable() {
@Override
public void run() {
JSONObject data = (JSONObject)args[0];
try {
String sendername = data.getString("sender");
String lastMessage = data.getString("message");
String profileImage = data.getString("Profile");
String token = data.getString("fb_token");
chat_list chat_list = new chat_list(sendername,
profileImage, lastMessage, "0", "", "dummy", token);

if (chat_lists.size()==0){
chat_lists.add(chat_list);
}else {
for (int i=0;i<chat_lists.size();i++){
if (chat_lists.get(i).getContactname().equals(sendername)){
chat_lists.set(i,chat_list);
}else {
chat_lists.add(chat_list)
}
}
}
contactlistAdapter = new ContactlistAdapter(chat_lists);
recyclerView.setAdapter(contactlistAdapter);
contactlistAdapter.notifyDataSetChanged();

} catch (JSONException e) {
e.printStackTrace();
}
}
});
}
};

好吧,你可以以合乎逻辑的方式使用ArrayList的contains()set()方法来解决问题,如下所示:

if(chat_lists.contains(username)) 
chat_lists.set(indexOf(username), new_username);
else chat_lists.add(new_username);

试试看:

if(chat_lists.contains(chat_list)){
chat_lists.remove(chat_list);
chat_lists.add(chat_list);
} else {
chat_lists.add(chat_list);
}

阅读架构模式,例如 MVP。 您需要将消息存储在某个地方(在模型中)并更新相对于数据的视图。

另请阅读有关RecyclerView的信息,ListView的原因有点不推荐使用

if (chat_lists.get(i).getContactname().equals(sendername)){

上述陈述有问题。它不是在您的 if 条件下并遵循chat_lists.add(chat_list)语句。

而是equals使用ignoreCasequals.如果仍然不能解决您的问题,请使用调试模式或日志检查chat_lists.get(i).getContactname()sendername相同与否。

最新更新