tableList在哪里变为空?为什么?

tableList在哪里变为空?为什么?

问题描述:

我正在实现一个Adapter来获取List和Hashmap,并将它们分别转换为可扩展ListView的标题和子元素。在构造函数的Log语句中,它显示值正在成功传输到本地列表。但之后它突然变为空。tableList在哪里变为空?为什么?

我不能确定哪里出了问题,在哪里。请帮忙。

这里是我的适配器类代码:

class ExpandableListViewAdapterDemo extends BaseExpandableListAdapter{ 

Context context = null; 
private List<String> headersList;//semester's name and year 
private HashMap<String, List<String>> tableList;//course names with its grades and gpa 

static final String TAG = "**Adapter Demo**"; 

ExpandableListViewAdapterDemo(Context context, List<String> list, 
           HashMap<String, List<String>> hashMap){ 
    this.context = context; 
    headersList = list; 
    tableList = hashMap; 
    Log.e(TAG, "hashmap list value = "+hashMap.get("Spring 2016")); 
    Log.e(TAG, "initial table list value = "+tableList.get("Spring 2016")); 
    printMap(tableList); 
    //printAll(); 
    Log.e(TAG, "groupCount = "+getGroupCount()); 

} 

void printAll(){ 
    Log.e(TAG, "headers count = "+headersList.size()); 
    for (int i = 0; i < headersList.size() ; i++) { 
     Log.e(TAG, "header at i="+i+" ,"+headersList.get(i)); 
    } 
    printMap(tableList); 
} 

private static void printMap(HashMap mp) { 
    Iterator it = mp.entrySet().iterator(); 
    while (it.hasNext()) { 
     HashMap.Entry pair = (HashMap.Entry)it.next(); 
     Log.e(TAG, "#253 : "+pair.getKey() + " = " + pair.getValue()); 
     it.remove(); // avoids a ConcurrentModificationException 
    } 
} 

@Override 
public int getGroupCount() { 
    Log.e(TAG, "#299 : table list value = "+tableList.get("Spring 2016")); 
    return headersList.size(); 
} 

@Override 
public int getChildrenCount(int i) { 
    //Log.e(TAG, "at i="+i+" "+headersList.get(i)); 
    int returns = 0; 
    Log.e(TAG, "#307 : table list value = "+tableList.get("Spring 2016")); 
    if (tableList.get(headersList.get(i)) != null) 
     returns = tableList.get(headersList.get(i)).size(); 
    else 
     Log.e(TAG, "tableList is null"); 
    Log.e(TAG, "details size = "+returns); 
    Log.e(TAG, "group count = "+getGroupCount()); 
    int tosubtract = 2 * getGroupCount(); 
    if (returns>tosubtract) 
     returns = returns - tosubtract - 2; 
    Log.e(TAG, "child count returns = "+String.valueOf(returns)); 
    return i; 
} 

@Override 
public Object getGroup(int i) { 
    Log.e(TAG, "#323 : table list value = "+tableList.get("Spring 2016")); 
    return headersList.get(i); 
} 

@Override 
public Object getChild(int i, int i1) { 
    Log.e(TAG, "#329 : table list value = "+tableList.get("Spring 2016")); 
    return tableList.get(headersList.get(i)).get(i1); 
} 

@Override 
public long getGroupId(int i) { 
    Log.e(TAG, "#335 : table list value = "+tableList.get("Spring 2016")); 
    return i; 
} 

@Override 
public long getChildId(int i, int i1) { 
    Log.e(TAG, "#340 : table list value = "+tableList.get("Spring 2016")); 
    return i1; 
} 

@Override 
public boolean hasStableIds() { 
    Log.e(TAG, "#347 : table list value = "+tableList.get("Spring 2016")); 
    return false; 
} 

@Override 
public View getGroupView(int i, boolean b, View view, ViewGroup viewGroup) { 
    Log.e(TAG, "#353 : table list value = "+tableList.get("Spring 2016")); 
    String semesterTitle = (String) getGroup(i); 
    if (view == null){ 
     LayoutInflater inf = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     view = inf.inflate(R.layout.previous_semesters_result_list_headers, null); 
    } 

    TextView semesterName = (TextView) view.findViewById(R.id.semester_name); 
    semesterName.setText(semesterTitle); 
    return view; 
} 

@Override 
public View getChildView(int i, int i1, boolean b, View view, ViewGroup viewGroup) { 
    Log.e(TAG, "#367 : table list value = "+tableList.get("Spring 2016")); 
    String courseIdTitle = (String) getChild(i, i1); 
    String gpa = (String) getChild(i, i1+getChildrenCount(i));//previously i1+4 
    String grade = (String) getChild(i, i1+getChildrenCount(i)+getChildrenCount(i)); 
    if (view == null){ 
     LayoutInflater inf = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     view = inf.inflate(R.layout.previous_semesters_results_list_child, null); 
    } 
    TextView courseIdValue = (TextView) view.findViewById(R.id.course_id_column_value); 
    courseIdValue.setText(courseIdTitle); 
    TextView gradeValue = (TextView) view.findViewById(R.id.grade_column_value); 
    gradeValue.setText(grade); 
    TextView gpaValue = (TextView) view.findViewById(R.id.gpa_column_value); 
    gpaValue.setText(gpa); 
    return view; 
} 

@Override 
public boolean isChildSelectable(int i, int i1) { 
    Log.e(TAG, "#386 : table list value = "+tableList.get("Spring 2016")); 
    return true; 
} 
} 

这里是我的日志:

+0

看起来你需要学习使用调试器。请帮助你一些补充性的调试技术。 –

您在打印地图中删除的项目,

​​

只是删除此它会正常工作。

private static void printMap(HashMap mp) { 
    Iterator it = mp.entrySet().iterator(); 
    while (it.hasNext()) { 
     HashMap.Entry pair = (HashMap.Entry)it.next(); 
     Log.e(TAG, "#253 : "+pair.getKey() + " = " + pair.getValue()); 
     //it.remove(); // avoids a ConcurrentModificationException 
    } 
} 

在你的方法printMap(),在while块的最后一条语句是

it.remove(); // avoids a ConcurrentModificationException 

这种说法可能不会导致Exception但它会从HashMap当前条目。所以在ExpandableListViewAdapterDemoConstructor执行

printMap(tableList); 

之后,tableList将是空的。