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

今天在写程序时遇到一个很容易犯错的问题,下面记录一下,首先看代码:

private void loadData() {
	
	Map contentMap = null;
	
	classroomListItems.clear();			// classroomListItems = new ArrayList>>();
	
	for(String key : MainActivity.classroomMap.keySet()) {

		contentListItems.clear();		// contentListItems = new ArrayList< Map >();
		
		for(int j = 0; j < MainActivity.classroomMap.get(key).size(); ++j) {
			contentMap = new HashMap();
			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> 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);
	}
}

上述代码存在一个问题,当我运行的时候,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 >();
contentListItems.clear();
....
}


问题很简单,只是我自己太粗心了


你可能感兴趣的:(java,/,Android)