您的位置:首页 > 其它

List使用add方法添加数据时的覆盖问题

2016-04-11 23:24 597 查看
今天在写程序时遇到一个很容易犯错的问题,下面记录一下,首先看代码:

<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();
....
}


问题很简单,只是我自己太粗心了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: