List使用add方法添加數據時的覆蓋問題

今天在寫程序時遇到一個很容易犯錯的問題,下面記錄一下,首先看代碼:

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


問題很簡單,只是我自己太粗心了


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章