19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage android.app; 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.database.Cursor; 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.os.Bundle; 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.List; 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.ContextMenu; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.View; 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.ContextMenu.ContextMenuInfo; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.view.View.OnCreateContextMenuListener; 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.ExpandableListAdapter; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.ExpandableListView; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.SimpleCursorTreeAdapter; 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.SimpleExpandableListAdapter; 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport android.widget.AdapterView.AdapterContextMenuInfo; 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Map; 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * An activity that displays an expandable list of items by binding to a data 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * source implementing the ExpandableListAdapter, and exposes event handlers 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * when the user selects an item. 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * ExpandableListActivity hosts a 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.widget.ExpandableListView ExpandableListView} object that can 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * be bound to different data sources that provide a two-levels of data (the 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * top-level is group, and below each group are children). Binding, screen 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * layout, and row layout are discussed in the following sections. 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <strong>Screen Layout</strong> 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </p> 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * ExpandableListActivity has a default layout that consists of a single, 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * full-screen, centered expandable list. However, if you desire, you can 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * customize the screen layout by setting your own view layout with 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * setContentView() in onCreate(). To do this, your own view MUST contain an 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * ExpandableListView object with the id "@android:id/list" (or 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.R.id#list} if it's in code) 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Optionally, your custom view can contain another view object of any type to 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * display when the list view is empty. This "empty list" notifier must have an 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * id "android:empty". Note that when an empty view is present, the expandable 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * list view will be hidden when there is no data to display. 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The following code demonstrates an (ugly) custom screen layout. It has a list 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * with a green background, and an alternate red "no data" message. 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </p> 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <pre> 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <?xml version="1.0" encoding="UTF-8"?> 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * android:orientation="vertical" 68980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy * android:layout_width="match_parent" 69980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy * android:layout_height="match_parent" 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * android:paddingLeft="8dp" 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * android:paddingRight="8dp"> 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <ExpandableListView android:id="@id/android:list" 74980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy * android:layout_width="match_parent" 75980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy * android:layout_height="match_parent" 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * android:background="#00FF00" 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * android:layout_weight="1" 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * android:drawSelectorOnTop="false"/> 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <TextView android:id="@id/android:empty" 81980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy * android:layout_width="match_parent" 82980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy * android:layout_height="match_parent" 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * android:background="#FF0000" 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * android:text="No data"/> 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </LinearLayout> 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </pre> 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <strong>Row Layout</strong> 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </p> 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The {@link ExpandableListAdapter} set in the {@link ExpandableListActivity} 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * via {@link #setListAdapter(ExpandableListAdapter)} provides the {@link View}s 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * for each row. This adapter has separate methods for providing the group 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link View}s and child {@link View}s. There are a couple provided 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link ExpandableListAdapter}s that simplify use of adapters: 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link SimpleCursorTreeAdapter} and {@link SimpleExpandableListAdapter}. 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * With these, you can specify the layout of individual rows for groups and 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * children in the list. These constructor takes a few parameters that specify 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * layout resources for groups and children. It also has additional parameters 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * that let you specify which data field to associate with which object in the 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * row layout resource. The {@link SimpleCursorTreeAdapter} fetches data from 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link Cursor}s and the {@link SimpleExpandableListAdapter} fetches data 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * from {@link List}s of {@link Map}s. 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </p> 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Android provides some standard row layout resources. These are in the 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.R.layout} class, and have names such as simple_list_item_1, 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * simple_list_item_2, and two_line_list_item. The following layout XML is the 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * source for the resource two_line_list_item, which displays two data 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * fields,one above the other, for each list row. 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </p> 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <pre> 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <?xml version="1.0" encoding="utf-8"?> 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 117980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy * android:layout_width="match_parent" 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * android:layout_height="wrap_content" 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * android:orientation="vertical"> 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <TextView android:id="@+id/text1" 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * android:textSize="16sp" 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * android:textStyle="bold" 124980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy * android:layout_width="match_parent" 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * android:layout_height="wrap_content"/> 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <TextView android:id="@+id/text2" 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * android:textSize="16sp" 129980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy * android:layout_width="match_parent" 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * android:layout_height="wrap_content"/> 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </LinearLayout> 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </pre> 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You must identify the data bound to each TextView object in this layout. The 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * syntax for this is discussed in the next section. 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </p> 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <strong>Binding to Data</strong> 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </p> 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You bind the ExpandableListActivity's ExpandableListView object to data using 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * a class that implements the 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.widget.ExpandableListAdapter ExpandableListAdapter} interface. 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Android provides two standard list adapters: 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.widget.SimpleExpandableListAdapter SimpleExpandableListAdapter} 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * for static data (Maps), and 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link android.widget.SimpleCursorTreeAdapter SimpleCursorTreeAdapter} for 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Cursor query results. 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * </p> 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see #setListAdapter 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see android.widget.ExpandableListView 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class ExpandableListActivity extends Activity implements 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project OnCreateContextMenuListener, 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ExpandableListView.OnChildClickListener, ExpandableListView.OnGroupCollapseListener, 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ExpandableListView.OnGroupExpandListener { 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ExpandableListAdapter mAdapter; 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ExpandableListView mList; 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean mFinishedStart = false; 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Override this to populate the context menu when an item is long pressed. menuInfo 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * will contain an {@link android.widget.ExpandableListView.ExpandableListContextMenuInfo} 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * whose packedPosition is a packed position 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * that should be used with {@link ExpandableListView#getPackedPositionType(long)} and 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the other similar methods. 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Override this for receiving callbacks when a child has been clicked. 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * <p> 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@inheritDoc} 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int childPosition, long id) { 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Override this for receiving callbacks when a group has been collapsed. 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onGroupCollapse(int groupPosition) { 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Override this for receiving callbacks when a group has been expanded. 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onGroupExpand(int groupPosition) { 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Ensures the expandable list view has been created before Activity restores all 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * of the view states. 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *@see Activity#onRestoreInstanceState(Bundle) 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project protected void onRestoreInstanceState(Bundle state) { 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ensureList(); 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.onRestoreInstanceState(state); 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Updates the screen state (current list and other views) when the 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * content changes. 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see Activity#onContentChanged() 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void onContentChanged() { 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super.onContentChanged(); 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project View emptyView = findViewById(com.android.internal.R.id.empty); 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mList = (ExpandableListView)findViewById(com.android.internal.R.id.list); 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mList == null) { 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new RuntimeException( 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Your content must have a ExpandableListView whose id attribute is " + 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "'android.R.id.list'"); 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (emptyView != null) { 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mList.setEmptyView(emptyView); 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mList.setOnChildClickListener(this); 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mList.setOnGroupExpandListener(this); 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mList.setOnGroupCollapseListener(this); 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mFinishedStart) { 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setListAdapter(mAdapter); 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mFinishedStart = true; 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Provide the adapter for the expandable list. 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setListAdapter(ExpandableListAdapter adapter) { 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project synchronized (this) { 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ensureList(); 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mAdapter = adapter; 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mList.setAdapter(adapter); 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Get the activity's expandable list view widget. This can be used to get the selection, 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * set the selection, and many other useful functions. 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @see ExpandableListView 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ExpandableListView getExpandableListView() { 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ensureList(); 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mList; 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Get the ExpandableListAdapter associated with this activity's 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * ExpandableListView. 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ExpandableListAdapter getExpandableListAdapter() { 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mAdapter; 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void ensureList() { 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (mList != null) { 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project setContentView(com.android.internal.R.layout.expandable_list_content); 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Gets the ID of the currently selected group or child. 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return The ID of the currently selected group or child. 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long getSelectedId() { 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mList.getSelectedId(); 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Gets the position (in packed position representation) of the currently 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * selected group or child. Use 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link ExpandableListView#getPackedPositionType}, 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link ExpandableListView#getPackedPositionGroup}, and 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * {@link ExpandableListView#getPackedPositionChild} to unpack the returned 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * packed position. 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return A packed position representation containing the currently 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * selected group or child's position and type. 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public long getSelectedPosition() { 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mList.getSelectedPosition(); 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the selection to the specified child. If the child is in a collapsed 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * group, the group will only be expanded and child subsequently selected if 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * shouldExpandGroup is set to true, otherwise the method will return false. 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param groupPosition The position of the group that contains the child. 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param childPosition The position of the child within the group. 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param shouldExpandGroup Whether the child's group should be expanded if 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * it is collapsed. 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return Whether the selection was successfully set on the child. 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean setSelectedChild(int groupPosition, int childPosition, boolean shouldExpandGroup) { 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mList.setSelectedChild(groupPosition, childPosition, shouldExpandGroup); 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Sets the selection to the specified group. 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param groupPosition The position of the group that should be selected. 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public void setSelectedGroup(int groupPosition) { 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mList.setSelectedGroup(groupPosition); 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 325