今天在写程序时遇到一个很容易犯错的问题,下面记录一下,首先看代码:
<span style="font-size:12px;">private void loadData() {
Map<String, Object> contentMap = null;
classroomListItems.clear(); // classroomListItems = new ArrayList<List<Map<String, Object>>>();
for(String key : MainActivity.classroomMap.keySet()) {
contentListItems.clear(); // contentListItems = new ArrayList< Map<String, Object> >();
for(int j = 0; j < MainActivity.classroomMap.get(key).size(); ++j) {
contentMap = new HashMap<String, Object>();
contentMap.put("courseTime", MainActivity.classroomMap.get(key).get(j).getStarttime().substring(11, 16) + "-"
+ MainActivity.classroomMap.get(key).get(j).getEndtime().substring(11, 16));
contentMap.put("courseName", MainActivity.classroomMap.get(key).get(j).getCourse_name());
contentMap.put("classroomName", MainActivity.classroomMap.get(key).get(j).getClassroom_name());
contentListItems.add(contentMap);
}
classroomListItems.add(contentListItems);
Log.e("contentListItems", contentListItems.get(0).get("classroomName").toString());
}
for(List<Map<String, Object>> list : classroomListItems) {
Log.e("classroomListItems", list.get(0).get("classroomName").toString());
}
if (null == adapter) {
adapter = new ClassroomAdapter(ctx, contentListItems, classroomListItems); // 创建适配器
listView.setAdapter(adapter);
} else {
adapter.refresh(classroomListItems);
}
}</span>上述代码存在一个问题,当我运行的时候,classroomListItems的size是正常的,而其中的元素却全部都是最后添加进去的contentListItems,也就是说每次添加contentListItems时覆盖了前面的数据。
当然,问题的原因也很简单:
在我循环添加数据的时候,我只声明了一次contentListItems,也就是只有一个contentListItems这个List,这样我每次写入Map数据的List都是同一个List,所以当我把这个List添加进classroomListItems时,添加的本质是contentListItems的地址,所以每次都是同一个contentListItems,这样后面的数据就覆盖了前面的数据。
解决方法就是每次都生成一个List:
for(String key : MainActivity.classroomMap.keySet()) {
contentListItems = new ArrayList< Map<String, Object> >();
contentListItems.clear();
....
}
问题很简单,只是我自己太粗心了
本文记录了一个在使用Java中List的add方法添加数据时容易遇到的问题,即在循环中添加数据时,由于多次操作的是同一个List对象,导致数据被覆盖。问题关键在于理解add方法添加的是List的引用而非复制。解决方案是每次循环内部创建新的List实例来添加数据,避免地址引用导致的数据覆盖。
2万+

被折叠的 条评论
为什么被折叠?



