【问题标题】:Replace element of ArrayList if object of same value already present in it如果其中已存在相同值的对象,则替换 ArrayList 的元素
【发布时间】:2018-12-08 05:47:58
【问题描述】:

我正在为我的聊天应用程序使用 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();
                    }
            }
        });
    }
};

【问题讨论】:

  • 那么你现在面临的问题是什么?
  • 我得到了同一个项目的 2 个副本。
  • 第一个副本没有被替换,第二个副本出现在最后一个右边?
  • 是的,没错。

标签: java arraylist socket.io


【解决方案1】:

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

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

else chat_lists.add(new_username);

【讨论】:

    【解决方案2】:

    试试看:

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

    【讨论】:

      【解决方案3】:

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

      还阅读了 RecyclerView,原因是 ListView 有点不推荐使用

      【讨论】:

        【解决方案4】:
        if (chat_lists.get(i).getContactname().equals(sendername)){
        

        上面的语句有问题。它不符合您的 if 条件并遵循 chat_lists.add(chat_list) 语句。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-08-02
          • 2021-10-08
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-07-20
          • 2017-08-23
          • 2017-07-04
          相关资源
          最近更新 更多