--- /dev/null
+package net.sf.openrocket.android.util;\r
+\r
+import java.util.ArrayList;\r
+import java.util.List;\r
+\r
+import android.content.Context;\r
+import android.os.Bundle;\r
+import android.os.Parcelable;\r
+import android.util.AttributeSet;\r
+import android.widget.ExpandableListAdapter;\r
+import android.widget.ExpandableListView;\r
+\r
+public class PersistentExpandableListView extends ExpandableListView {\r
+\r
+ public PersistentExpandableListView(Context context, AttributeSet attrs,\r
+ int defStyle) {\r
+ super(context, attrs, defStyle);\r
+ }\r
+\r
+ public PersistentExpandableListView(Context context, AttributeSet attrs) {\r
+ super(context, attrs);\r
+ }\r
+\r
+ public PersistentExpandableListView(Context context) {\r
+ super(context);\r
+ }\r
+\r
+ @Override\r
+ public Parcelable onSaveInstanceState() {\r
+ Bundle b = new Bundle();\r
+ long[] expandedIds = getExpandedIds();\r
+ b.putLongArray("ExpandedIds", expandedIds);\r
+ return b;\r
+ }\r
+\r
+ @Override\r
+ public void onRestoreInstanceState(Parcelable state) {\r
+ Bundle b = (Bundle) state;\r
+ long[] expandedIds = b.getLongArray("ExpandedIds");\r
+ restoreExpandedState(expandedIds);\r
+ }\r
+\r
+ private long[] getExpandedIds() {\r
+ ExpandableListAdapter adapter = getExpandableListAdapter();\r
+ if (adapter != null) {\r
+ int length = adapter.getGroupCount();\r
+ ArrayList<Long> expandedIds = new ArrayList<Long>();\r
+ for(int i=0; i < length; i++) {\r
+ if(this.isGroupExpanded(i)) {\r
+ expandedIds.add(adapter.getGroupId(i));\r
+ }\r
+ }\r
+ return toLongArray(expandedIds);\r
+ } else {\r
+ return null;\r
+ }\r
+ }\r
+\r
+ private static long[] toLongArray(List<Long> list) {\r
+ long[] ret = new long[list.size()];\r
+ int i = 0;\r
+ for (Long e : list) \r
+ ret[i++] = e.longValue();\r
+ return ret;\r
+ }\r
+\r
+ private void restoreExpandedState(long[] expandedIds) {\r
+ if (expandedIds != null) {\r
+ ExpandableListAdapter adapter = getExpandableListAdapter();\r
+ if (adapter != null) {\r
+ for (int i=0; i<adapter.getGroupCount(); i++) {\r
+ long id = adapter.getGroupId(i);\r
+ if (inArray(expandedIds, id)) this.expandGroup(i);\r
+ }\r
+ }\r
+ }\r
+ }\r
+\r
+ private static boolean inArray(long[] array, long element) {\r
+ for (long l : array) {\r
+ if (l == element) {\r
+ return true;\r
+ }\r
+ }\r
+ return false;\r
+ }\r
+\r
+\r
+}\r