2012-04-04 29 views
1

我需要某人来指导我找到一个错误。当我接到电话或去其他活动时,当我回来时,所有的群组都被折叠。系统没有销毁活动,所以我无法保存和恢复onRestoreInstanceState中的状态,因为该方法从未被调用过(活动仅被暂停和停止,但未被销毁)。ExpandableListView每当我从其他活动回来时都会崩溃所有组项目

Activity扩展了ExpandableListActivity,我使用的适配器是SimpleCursorTreeAdapter。

在哪些情况下可展开列表已折叠?我要疯了,我找不到解决方案。

在此先感谢。

编辑:这是我的活动
的生命周期,当Activivy首次启动:
的onCreate() - >在onStart() - >的onResume()
,当我去其他活动:
的onPause( ) - >的onStop()
,当我回来:
onRestart - >在onStart() - >的onResume()

+0

我正在做类似的东西这里http://stackoverflow.com/questions/10611927/simplecursortreeadapter-and-cursorloader – toobsco42 2012-05-16 07:23:58

回答

1

不幸的是,每当焦点丢失时,扩展状态总是会重置,并且onCreate()在再次获得焦点但onStart()时未被调用。所以我现在的解决方法是手动存储所有扩展项目的ID并再次将它们展开到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 2012-04-05 09:56:18

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(); 

创建追踪生命周期不一致时,你从扩展应该是你的第一个步骤记录活动。

相关问题