2012-04-04 2 views
1

Мне нужен кто-то, кто поможет мне найти ошибку. Когда я получаю звонок или перехожу к другому действию, когда я возвращаюсь, все группы рушится. Система не уничтожила активность, поэтому я не могу сохранить и восстановить состояние в onRestoreInstanceState, потому что метод никогда не вызывается (активность приостановлена ​​и остановлена, но не уничтожена).ExpandableListView сворачивает все элементы группы каждый раз, когда я возвращаюсь из другой активности.

Деятельность расширяет расширяемуюListActivity и адаптер, который я использую, является SimpleCursorTreeAdapter.

В каких случаях расширяемый список рушится? Я схожу с ума, и я не могу найти решение.

Заранее спасибо.

Edit: Это жизненный цикл моей деятельности
когда Activivy начинается в первый раз:
OnCreate() -> OnStart() -> onResume()
, когда я иду в другой деятельности:
OnPause () -> OnStop()
и когда я вернусь:
onRestart -> OnStart() -> onResume()

+0

Я делаю что-то подобное ЗДЕСЬ http://stackoverflow.com/questions/10611927/simplecursortreeadapter-and-cursorloader – toobsco42

ответ

1

К сожалению, расширенное состояние всегда сбрасывается всякий раз, когда фокус теряется, а onCreate() не вызывается, когда он снова получает фокус, а onStart(). Таким образом, на мой взгляд, теперь нужно вручную хранить идентификаторы всех расширенных элементов и снова расширять их в onStart(). Я применил подкласс ExpandableListActivity для повторного использования поведения.

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

Возможно, у кого-то есть лучшее решение.

+0

Спасибо. Он работает отлично. – Jesus

0

Вы можете сохранить любую информацию о состоянии путем переопределения OnPause() и onResume() в вашей деятельности ,

Вы должны иметь возможность сохранить выбранный элемент, а затем повторно выбрать элемент, когда действие возобновлено. Вы также можете добавить это в onStop() и onStart().

Если действие приостановлено или остановлено, все Views должно сохранять свое состояние, поскольку оно не уничтожается и не воссоздается. Попробуйте добавить протоколирование к каждому из «больших» методов жизненного цикла:

protected void onCreate(Bundle savedInstanceState); 

protected void onStart(); 

protected void onRestart(); 

protected void onResume(); 

protected void onPause(); 

protected void onStop(); 

protected void onDestroy(); 

Создания лесозаготовительной деятельности которого проходит от должна быть вашим первым шагом, когда отслеживание жизненных цикла несоответствий.