2012-03-21 43 views
5

Estoy escribiendo filtro simple en Android y quiero usar ExpandableListAdapter con casillas de verificación.ExpandableListView y casillas de verificación

No tengo ningún problema para crear una lista o marcar la casilla. pero realmente no sé cómo recordar las elecciones. Después de cerrar el grupo y abrir de nuevo o cuando intento abrir diferentes grupos, las casillas de verificación son cambios.

Intenté leer en la red sobre eso pero no encontré cómo solucionar mi problema.

Aquí está mi código:

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

para qué propósito de esta línea: Tasks.Status status [] = Tasks.Status.values ​​(); . Por favor, dame soluciones –

+0

Tengo un problema similar con las casillas de verificación de mi lista desplegable. He descubierto una forma de guardar los valores, pero las complicaciones con el hecho de que las casillas de verificación son inconstantes me han impedido avanzar desde la vista desplegable de mi proyecto. Por favor, publique el código o responda para ponerse en contacto, ya que estoy muy interesado en ver cómo se acercó con una solución. – AlleyOOP

Respuesta

2

Depende de la cantidad que desea utilizar técnicas de ingeniería. Un Mapa> funcionaría. El mapa toma una posición y te da un conjunto de niños marcados. Para determinar si un niño está marcado o no, llame a Map.get() en el grupo, y luego vea si el conjunto contiene la identificación del niño.

Si desea ver si se comprueba el segundo hijo del tercer grupo, que podría hacer:

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

Para configurar un niño verificado:

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

Para establecer un niño sin control:

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

Debería inicializar el mapa para contener conjuntos vacíos para cada grupo para evitar los NPE, pero eso Es fácil de hacer la primera vez que creas el mapa. Estoy seguro de que podrías encontrar una manera más limpia de hacerlo, pero es simple y funcionaría.

Cuestiones relacionadas