2010-11-15 13 views
11

Tengo una ExpandableListActivity (usando un SimpleCursorTreeAdapter) que inicia otra actividad cuando el usuario hace clic en un elemento secundario. Al presionar el botón Atrás en la nueva actividad, todos los elementos de la lista colapsan nuevamente. ¿Cómo guardo el estado expandido de ExpandableListActivity y lo restauro de nuevo?Guardar y restaurar el estado expandido/contraído de una ExpandableListActivity

Ya he probado a onSaveInstanceState implementado() y onRestoreInstanceState() así ...

@Override 
protected void onSaveInstanceState(Bundle outState) { 
    super.onSaveInstanceState(outState); 
    Parcelable listState = getExpandableListView().onSaveInstanceState(); 
    outState.putParcelable("ListState", listState); 
} 


@Override 
protected void onRestoreInstanceState(Bundle state) { 
    super.onRestoreInstanceState(state); 
    Parcelable listState = state.getParcelable("ListState"); 
    getExpandableListView().onRestoreInstanceState(listState); 
} 

... pero onRestoreInstanceState() no es llamado. También probé para restaurar el estado en el método onCreate(), pero no se llama así:

if (savedInstanceState != null) { 
    Parcelable listState = savedInstanceState.getParcelable("ListState"); 
    getExpandableListView().onRestoreInstanceState(listState); 
} 
+0

estoy haciendo algo similar aquí http://stackoverflow.com/questions/10611927/simplecursortreeadapter-and-cursorloader – toobsco42

+0

@ toobsco42 No veo cómo esto se relaciona con la pregunta – Tom

+0

Tenga cuidado de volver a configurar el adaptador cuando regrese a la actividad anterior. Volver a establecer el adaptador colapsará la lista. – jayeffkay

Respuesta

11

Desafortunadamente el estado expandido siempre se restablece cada vez que se pierde el enfoque y onCreate() no se llama cuando se pone el foco de nuevo, pero onStart(). Por lo tanto, mi solución por ahora es almacenar manualmente los ID de todos los elementos expandidos y expandirlos en onStart() nuevamente. Implementé una subclase de ExpandableListActivity para reutilizar el comportamiento.

public class PersistentExpandableListActivity extends ExpandableListActivity { 
    private long[] expandedIds; 

    @Override 
    protected void onStart() { 
     super.onStart(); 
     if (this.expandedIds != null) { 
      restoreExpandedState(expandedIds); 
     } 
    } 

    @Override 
    protected void onStop() { 
     super.onStop(); 
     expandedIds = getExpandedIds(); 
    } 

    @Override 
    protected void onSaveInstanceState(Bundle outState) { 
     super.onSaveInstanceState(outState); 
     this.expandedIds = getExpandedIds(); 
     outState.putLongArray("ExpandedIds", this.expandedIds); 
    } 

    @Override 
    protected void onRestoreInstanceState(Bundle state) { 
     super.onRestoreInstanceState(state); 
     long[] expandedIds = state.getLongArray("ExpandedIds"); 
     if (expandedIds != null) { 
      restoreExpandedState(expandedIds); 
     } 
    } 

    private long[] getExpandedIds() { 
     ExpandableListView list = getExpandableListView(); 
     ExpandableListAdapter adapter = getExpandableListAdapter(); 
     if (adapter != null) { 
      int length = adapter.getGroupCount(); 
      ArrayList<Long> expandedIds = new ArrayList<Long>(); 
      for(int i=0; i < length; i++) { 
       if(list.isGroupExpanded(i)) { 
        expandedIds.add(adapter.getGroupId(i)); 
       } 
      } 
      return toLongArray(expandedIds); 
     } else { 
      return null; 
     } 
    } 

    private void restoreExpandedState(long[] expandedIds) { 
     this.expandedIds = expandedIds; 
     if (expandedIds != null) { 
      ExpandableListView list = getExpandableListView(); 
      ExpandableListAdapter adapter = getExpandableListAdapter(); 
      if (adapter != null) { 
       for (int i=0; i<adapter.getGroupCount(); i++) { 
        long id = adapter.getGroupId(i); 
        if (inArray(expandedIds, id)) list.expandGroup(i); 
       } 
      } 
     } 
    } 

    private static boolean inArray(long[] array, long element) { 
     for (long l : array) { 
      if (l == element) { 
       return true; 
      } 
     } 
     return false; 
    } 

    private static long[] toLongArray(List<Long> list) { 
     long[] ret = new long[list.size()]; 
     int i = 0; 
     for (Long e : list) 
      ret[i++] = e.longValue(); 
     return ret; 
    } 
} 

Quizás alguien tenga una mejor solución.

0

probar esto. Se va a resolver el problema, en parte

yourlist.setSaveEnabled(true); 
+0

Lamentablemente, esto no cambia nada. – Tom

+0

Funciona solo para cambiar la orientación de una pantalla (si los datos del adaptador no se volverán a cargar después de cambiar la orientación de una pantalla) – user479211

2

Esto debería funcionar

Parcelable state = exercisesList.onSaveInstanceState(); 
exercisesList.setAdapter(....); 
exercisesList.onRestoreInstanceState(state); 
+1

La respuesta aceptada es completamente innecesaria. Esta es la forma correcta. – JanithaR

Cuestiones relacionadas