ExpandableListActivity:
An activity that displays an expandable list of items by binding to a data source implementing the ExpandableListAdapter, and exposes event handlers when the user selects an item.
即,可扩展的list,单击某个item后,又可显示一个子list。它的数据通过绑定到ExpandableListAdapter或者ExpandableListAdapter的子类上。
示例1—通过SimpelExpandableListAdapter绑定数据:
注意:android.R.layout.simple_expandable_list_item_1:表示只显示一个TextView的数据,即R.id.text1
android.R.layout.simple_expandable_list_item_2:表示显示二个TextView的数据,即R.id.text1,R.id,text2
android.R.layout.simple_expandable_list_item_2.xml(在R.layout中)文件的布局如下:
示例2—通过SimpleCussorTreeAdapter绑定数据:
示例3—通过BaseExpandableListAdapter绑定数据:
- public class ExpandableList1 extends ExpandableListActivity {
- ExpandableListAdapter mAdapter;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- // Set up our adapter
- mAdapter = new MyExpandableListAdapter();
- setListAdapter(mAdapter);
- // register context menu, when long click the item, it will show a dialog
- registerForContextMenu(getExpandableListView());
- }
- @Override
- public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) {
- menu.setHeaderTitle("Sample menu");
- menu.add(0, 0, 0, R.string.expandable_list_sample_action);
- }
- @Override
- public boolean onContextItemSelected(MenuItem item) {
- ExpandableListContextMenuInfo info = (ExpandableListContextMenuInfo) item.getMenuInfo();
- String title = ((TextView) info.targetView).getText().toString();
- int type = ExpandableListView.getPackedPositionType(info.packedPosition);
- if (type == ExpandableListView.PACKED_POSITION_TYPE_CHILD) {
- int groupPos = ExpandableListView.getPackedPositionGroup(info.packedPosition);
- int childPos = ExpandableListView.getPackedPositionChild(info.packedPosition);
- Toast.makeText(this, title + ": Child " + childPos + " clicked in group " + groupPos,
- Toast.LENGTH_SHORT).show();
- return true;
- } else if (type == ExpandableListView.PACKED_POSITION_TYPE_GROUP) {
- int groupPos = ExpandableListView.getPackedPositionGroup(info.packedPosition);
- Toast.makeText(this, title + ": Group " + groupPos + " clicked", Toast.LENGTH_SHORT).show();
- return true;
- }
- return false;
- }
- /**
- * A simple adapter which maintains an ArrayList of photo resource Ids.
- * Each photo is displayed as an image. This adapter supports clearing the
- * list of photos and adding a new photo.
- *
- */
- public class MyExpandableListAdapter extends BaseExpandableListAdapter {
- // Sample data set. children[i] contains the children (String[]) for groups[i].
- private String[] groups = { "People Names", "Dog Names", "Cat Names", "Fish Names" };
- private String[][] children = {
- { "Arnold", "Barry", "Chuck", "David" },
- { "Ace", "Bandit", "Cha-Cha", "Deuce" },
- { "Fluffy", "Snuggles" },
- { "Goldy", "Bubbles" }
- };
- public Object getChild(int groupPosition, int childPosition) {
- return children[groupPosition][childPosition];
- }
- public long getChildId(int groupPosition, int childPosition) {
- return childPosition;
- }
- public int getChildrenCount(int groupPosition) {
- return children[groupPosition].length;
- }
- public TextView getGenericView() {
- // Layout parameters for the ExpandableListView
- AbsListView.LayoutParams lp = new AbsListView.LayoutParams(
- ViewGroup.LayoutParams.FILL_PARENT, 64);
- TextView textView = new TextView(ExpandableList1.this);
- textView.setLayoutParams(lp);
- // Center the text vertically
- textView.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT);
- // Set the text starting position
- textView.setPadding(36, 0, 0, 0);
- return textView;
- }
- public View getChildView(int groupPosition, int childPosition, boolean isLastChild,
- View convertView, ViewGroup parent) {
- TextView textView = getGenericView();
- textView.setText(getChild(groupPosition, childPosition).toString());
- return textView;
- }
- public Object getGroup(int groupPosition) {
- return groups[groupPosition];
- }
- public int getGroupCount() {
- return groups.length;
- }
- public long getGroupId(int groupPosition) {
- return groupPosition;
- }
- public View getGroupView(int groupPosition, boolean isExpanded, View convertView,
- ViewGroup parent) {
- TextView textView = getGenericView();
- textView.setText(getGroup(groupPosition).toString());
- return textView;
- }
- public boolean isChildSelectable(int groupPosition, int childPosition) {
- return true;
- }
- public boolean hasStableIds() {
- return true;
- }
- }
- }
- public class ExpandableList2 extends ExpandableListActivity {
- private int mGroupIdColumnIndex;
- private String mPhoneNumberProjection[] = new String[] {
- People.Phones._ID, People.Phones.NUMBER
- };
- private ExpandableListAdapter mAdapter;
- /*
- * CursorTreeAdapter's method.
- * Gets the Cursor for the children at the given group
- * /
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- // Query for people
- Cursor groupCursor = managedQuery(People.CONTENT_URI,
- new String[] {People._ID, People.NAME}, null, null, null);
- // Cache the ID column index
- mGroupIdColumnIndex = groupCursor.getColumnIndexOrThrow(People._ID);
- // Set up our adapter
- mAdapter = new MyExpandableListAdapter(groupCursor,
- this,
- android.R.layout.simple_expandable_list_item_1,
- android.R.layout.simple_expandable_list_item_1,
- new String[] {People.NAME}, // Name for group layouts
- new int[] {android.R.id.text1},
- new String[] {People.NUMBER}, // Number for child layouts
- new int[] {android.R.id.text1});
- setListAdapter(mAdapter);
- }
- public class MyExpandableListAdapter extends SimpleCursorTreeAdapter {
- public MyExpandableListAdapter(Cursor cursor, Context context, int groupLayout,
- int childLayout, String[] groupFrom, int[] groupTo, String[] childrenFrom,
- int[] childrenTo) {
- super(context, cursor, groupLayout, groupFrom, groupTo, childLayout, childrenFrom,
- childrenTo);
- }
- @Override
- protected Cursor getChildrenCursor(Cursor groupCursor) {
- // Given the group, we return a cursor for all the children within that group
- // Return a cursor that points to this contact's phone numbers
- Uri.Builder builder = People.CONTENT_URI.buildUpon();
- ContentUris.appendId(builder, groupCursor.getLong(mGroupIdColumnIndex));
- builder.appendEncodedPath(People.Phones.CONTENT_DIRECTORY);
- Uri phoneNumbersUri = builder.build();
- // The returned Cursor MUST be managed by us, so we use Activity's helper
- // functionality to manage it for us.
- return managedQuery(phoneNumbersUri, mPhoneNumberProjection, null, null, null);
- }
- }
- }
- <?xml version="1.0" encoding="utf-8"?>
- <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"
- android:orientation="vertical">
- <TextView android:id="@+id/text1"
- android:textSize="16sp"
- android:textStyle="bold"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"/>
- <TextView android:id="@+id/text2"
- android:textSize="16sp"
- android:layout_width="fill_parent"
- android:layout_height="wrap_content"/>
- </LinearLayout>
- public class ExpandableList3 extends ExpandableListActivity {
- private static final String NAME = "NAME";
- private static final String IS_EVEN = "IS_EVEN";
- private ExpandableListAdapter mAdapter;
- @Override
- public void onCreate(Bundle savedInstanceState) {
- super.onCreate(savedInstanceState);
- List<Map<String, String>> groupData = new ArrayList<Map<String, String>>();
- List<List<Map<String, String>>> childData = new ArrayList<List<Map<String, String>>>();
- for (int i = 0; i < 20; i++) {
- Map<String, String> curGroupMap = new HashMap<String, String>();
- groupData.add(curGroupMap);
- curGroupMap.put(NAME, "Group " + i);
- curGroupMap.put(IS_EVEN, (i % 2 == 0) ? "This group is even" : "This group is odd");
- List<Map<String, String>> children = new ArrayList<Map<String, String>>();
- for (int j = 0; j < 15; j++) {
- Map<String, String> curChildMap = new HashMap<String, String>();
- children.add(curChildMap);
- curChildMap.put(NAME, "Child " + j);
- curChildMap.put(IS_EVEN, (j % 2 == 0) ? "This child is even" : "This child is odd");
- }
- childData.add(children);
- }
- // Set up our adapter
- mAdapter = new SimpleExpandableListAdapter(
- this,
- groupData, // 存储父list的数据
- android.R.layout.simple_expandable_list_item_2, //父list的现实方式
- new String[] { NAME,IS_EVEN}, // 父list需要显示的数据
- new int[] { android.R.id.text1,android.R.id.text2}, // 父list的数据绑定到的view
- childData, //子list的数据
- android.R.layout.simple_expandable_list_item_2,
- new String[] { NAME, IS_EVEN },
- new int[] { android.R.id.text1, android.R.id.text2 }
- );
- setListAdapter(mAdapter);
- }
- }