2017-07-26 3 views
0

J'implémente un adaptateur pour prendre List et Hashmap et les transformer en en-têtes et enfants respectivement pour un ListView extensible. Dans les instructions Log du constructeur, il montre que les valeurs sont transférées à la liste locale avec succès. Mais alors il devient soudainement nul.Où la tableList devient nulle? et pourquoi?

Je ne peux pas identifier ce qui s'est mal passé et où. S'il vous plaît aider.

Voici mon code pour la classe d'adaptateur:

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; 
} 
} 

Voici mon journal:

+0

Il semble que vous ayez besoin d'apprendre à utiliser un débogueur. S'il vous plaît aidez-vous à quelques techniques de débogage complémentaires. –

Répondre

1

Vous avez retiré l'élément lors de l'impression de la carte,

it.remove(); // avoids a ConcurrentModificationException 

supprimer Juste ce cela fonctionnera bien.

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 
    } 
} 
1

Dans votre méthode printMap(), la dernière instruction dans le bloc while est

it.remove(); // avoids a ConcurrentModificationException 

Cette déclaration ne peut pas causer une Exception mais il supprime l'entrée actuelle du HashMap. Donc, après l'exécution

printMap(tableList); 

dans le Constructor de ExpandableListViewAdapterDemo, le tableList sera vide.