2012-03-21 18 views
5

Sto scrivendo semplice filtro in Android e voglio usare ExpandableListAdapter con caselle di controllo.ExpandableListView e caselle di controllo

Non ho alcun problema con la creazione di elenchi o controllo casella di controllo. ma davvero non so come ricordare le scelte. Dopo aver chiuso il gruppo e riaperto o quando provo ad aprire gruppi diversi, le caselle di controllo sono modifiche.

Ho provato a leggere in rete, ma non ho trovato il modo di risolvere il mio problema.

Ecco il mio codice:

public class TasksFilterDialog extends Dialog{ 

private static final String TAG = "Filter Dialog"; 
private static final String ChildID = "ChildID"; 
private static final String GroupID = "GroupID"; 

private boolean[] statusCheck; 

ExpandableListView list; 
SimpleExpandableListAdapter listAdapter; 

public TasksFilterDialog(Context context) { 
    super(context); 
    statusCheck = new boolean[Tasks.Status.values().length]; 
    for(int i=0; i<statusCheck.length; i++) 
     statusCheck[i]=true; 
} 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    Log.d(TAG, "Creating dialog"); 
    this.setContentView(R.layout.tasks_filter); 
    list = (ExpandableListView)findViewById(R.id.filter_list); 
    setListAdapter();      // Setting Adapter Values to use on list 
    list.setAdapter(listAdapter);   // Setting creating adapter to list 
    setOnChildClickListeners();   


    Log.d(TAG, "Creating dialog successfull"); 
} 


private void setListAdapter() { 
    Log.d(TAG, "Setting list adapter"); 
    listAdapter = new SimpleExpandableListAdapter(this.getContext(), 
      getGroups(), 
      R.layout.tasks_filter_groups_layout, 
      new String[] {GroupID}, 
      new int[] {R.id.filter_group_text}, 
      getChilds(), 
      R.layout.tasks_filter_simple_element, 
      new String[] {ChildID}, 
      new int[] {R.id.filter_simple_element_text}); 

    Log.d(TAG, "Setting list adapter successfull"); 
} 

private List<HashMap<String, String>> getGroups() { 
    Log.d(TAG, "Adding groups values"); 
    List<HashMap<String, String>> list = new ArrayList<HashMap<String, String>>(); 
    HashMap<String, String> statusMap = new HashMap<String, String>(); 
    statusMap.put(GroupID, "Status"); 
    list.add(statusMap); 
    HashMap<String, String> usersMap = new HashMap<String, String>(); 
    usersMap.put(GroupID, "Users"); 
    list.add(usersMap); 
    Log.d(TAG, "Adding groups values successfull"); 
    return list; 
} 

private List<List<HashMap<String, String>>> getChilds() { 
    Log.d(TAG, "Adding childs values"); 
    List<List<HashMap<String, String>>> list = new ArrayList<List<HashMap<String, String>>>(); 
    List<HashMap<String, String>> secList = new ArrayList<HashMap<String, String>>(); 
    HashMap<String, String> map; 
    Tasks.Status status[] = Tasks.Status.values(); 
    for(int i=0; i<status.length; i++) { 
     Log.d(TAG, "Adding child" + status[i].toString()); 
     map = new HashMap<String, String>(); 
     map.put(ChildID, status[i].toString()); 
     secList.add(map); 
    } 
    list.add(secList); 
    list.add(secList); 
    Log.d(TAG, "Adding childs values succesfull"); 
    return list; 
} 

private void setOnChildClickListeners() { 
    list.setOnChildClickListener(new OnChildClickListener() { 

     @Override 
     public boolean onChildClick(ExpandableListView list, View v, 
       int group, int id, long arg4) { 
      CheckBox cb = (CheckBox) v.findViewById(R.id.filter_simple_element_check); 
      cb.toggle(); 
      switch(group){ 
      case 0: 
       if(statusCheck[id]) 
        statusCheck[id]=false; 
       else 
        statusCheck[id]=true; 
       break; 
      case 1: 
       //TODO After getting Tasks function 

      } 
      return false; 
     } 

    }); 

} 

}

+0

quale scopo per questa riga: stato Tasks.Status [] = Tasks.Status.values ​​(); . Per favore dammi soluzioni –

+0

Sto riscontrando un problema simile con le checkbox in my expandablelistview. Ho trovato un modo per salvare i valori, ma le complicazioni con le caselle di controllo che mi sono state volubili mi hanno impedito di andare avanti dalla finestra di dialogo expandablelist del mio progetto. Si prega di inviare il codice o rispondere per mettersi in contatto, in quanto sono molto interessato a vedere come vi siete avvicinati con una soluzione. – AlleyOOP

risposta

2

Dipende da quanto si vuole per progettare esso. Una mappa> funzionerebbe. La mappa prende posizione e ti dà una serie di bambini controllati. Per determinare se un bambino è selezionato o meno, chiama Map.get() sul gruppo, e poi guarda se il set contiene l'id del bambino.

Se volete vedere se il secondo figlio del terzo gruppo è selezionata, si potrebbe fare:

boolean isChecked = yourMap.get(3).contains(2); 

Per impostare un bambino controllato:

yourMap.get(groupNum).add(childNum); 

Per impostare un bambino incontrollato:

yourMap.get(groupNum).remove(childNum); 

Si avrebbe bisogno di inizializzare la mappa per contenere insieme vuoto per ogni gruppo per evitare di NPE, ma che È facile da fare quando crei per la prima volta la mappa. Sono sicuro che potresti trovare un modo più pulito per farlo, ma è semplice e funzionerebbe.

Problemi correlati