如果新列表有新条目,则生成通知,但每次我在旧列表中找到所有值。
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();
}
}
答案 0 :(得分:6)
执行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
如果您需要在list
中存储tmp
的副本,则需要在修改旧列表之前创建新列表:
List<User> tmp = new ArrayList<>(list);
请注意,两个列表中存储的User
对象仍然相同,因此如果您从一个列表中修改一个对象,它将反映在另一个列表中。