谁能告诉我为什么我的旧列表包含所有应该只存在于新列表中的值。?
Can anyone tell me why my old list has all the values which should be there only in the new list.?
- 我在 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
对象仍然相同,因此如果您修改一个列表中的对象,它将反映在另一个列表中。
- 我在 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
对象仍然相同,因此如果您修改一个列表中的对象,它将反映在另一个列表中。