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 * &lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;?&gt;
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * &lt;LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         android:orientation=&quot;vertical&quot;
68980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy *         android:layout_width=&quot;match_parent&quot;
69980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy *         android:layout_height=&quot;match_parent&quot;
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         android:paddingLeft=&quot;8dp&quot;
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         android:paddingRight=&quot;8dp&quot;&gt;
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     &lt;ExpandableListView android:id=&quot;@id/android:list&quot;
74980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy *               android:layout_width=&quot;match_parent&quot;
75980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy *               android:layout_height=&quot;match_parent&quot;
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *               android:background=&quot;#00FF00&quot;
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *               android:layout_weight=&quot;1&quot;
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *               android:drawSelectorOnTop=&quot;false&quot;/&gt;
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     &lt;TextView android:id=&quot;@id/android:empty&quot;
81980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy *               android:layout_width=&quot;match_parent&quot;
82980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy *               android:layout_height=&quot;match_parent&quot;
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *               android:background=&quot;#FF0000&quot;
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *               android:text=&quot;No data&quot;/&gt;
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * &lt;/LinearLayout&gt;
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 * &lt;?xml version=&quot;1.0&quot; encoding=&quot;utf-8&quot;?&gt;
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * &lt;LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
117980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy *     android:layout_width=&quot;match_parent&quot;
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     android:layout_height=&quot;wrap_content&quot;
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     android:orientation=&quot;vertical&quot;&gt;
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     &lt;TextView android:id=&quot;@+id/text1&quot;
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         android:textSize=&quot;16sp&quot;
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         android:textStyle=&quot;bold&quot;
124980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy *         android:layout_width=&quot;match_parent&quot;
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         android:layout_height=&quot;wrap_content&quot;/&gt;
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *     &lt;TextView android:id=&quot;@+id/text2&quot;
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         android:textSize=&quot;16sp&quot;
129980a938c1c9a6a5791a8240e5a1e6638ab28dc77Romain Guy *         android:layout_width=&quot;match_parent&quot;
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *         android:layout_height=&quot;wrap_content&quot;/&gt;
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * &lt;/LinearLayout&gt;
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