- 我在 tmp 中存储一个列表,然后在列表中添加新值。
- 刷新时,我将旧列表与新列表进行比较。
如果新列表有新条目,则会生成通知,但每次我都在旧列表中找到所有值。
public void populateList(String result) { ArrayList<User> tmp; tmp = list; list.clear(); try { JSONArray jsonArray = new JSONArray(result); for (int i = 0; i < jsonArray.length(); i++) { JSONObject json_data = jsonArray.getJSONObject(i); String NAME = json_data.getString(StaticMember.NAME); String STATUS = json_data.getString(StaticMember.STATUS); list.add(new User(NAME, STATUS)); } ArrayList tmpN = list; compare(tmp, tmpN); CustomAdapter customAdapter = new CustomAdapter(getApplicationContext(), android.R.layout.simple_list_item_1, list); lv.setAdapter((customAdapter)); } catch (Exception e) { e.printStackTrace(); } } public void compare(ArrayList list_old, ArrayList list_new) { try { Iterator<User> iterator_old = list_old.iterator(); Iterator<User> iterator_new = list_new.iterator(); while (iterator_new.hasNext()) { User user_new = iterator_new.next(); boolean NEW = true; while (iterator_old.hasNext()) { User user_old = iterator_old.next(); //Log.i(":N:"+user_new.getUsername(), ":O:"+user_old.getUsername()); if (user_new.getUsername().equals(user_old.getUsername())) { NEW = false; break; } } if (NEW) { generateNotification(getApplicationContext(), user_new.getUsername() + " has been added."); Log.i("True", "Changed"); } } } catch (Exception e) { e.printStackTrace(); } }
最佳答案
当您执行 tmp = list
时,您不会将 list
的值存储在 tmp
中。相反,您只需让 tmp
引用与 list
引用相同的对象。稍后,当您修改 list
时,您修改了 tmp
引用的内容。
最初,list
引用用户列表:
list -> [user0, user1, user2]
在tmp = list
之后,list
和tmp
都引用同一个列表:
list -> [user0, user1, user2] <- tmp
当您调用 list.clear()
时,您清除了原始列表:
list -> [] <- tmp
当你向 list
添加新元素时,你修改了原始列表:
list -> [newuser0] <- tmp
如果您需要在 tmp
中存储 list
的副本,您需要在修改旧列表之前创建一个新列表:
List<User> tmp = new ArrayList<>(list);
请注意,存储在两个列表中的 User
对象仍然相同,因此如果您修改一个列表中的对象,它将反射(reflect)在另一个列表中。
关于java - 谁能告诉我为什么我的旧列表包含所有应该只存在于新列表中的值。?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29129352/