一、MainActivity要继承ExpandableListActivity。效果是当单击ListView的子项是显示另一个ListView。
package com.example.explear; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import android.app.Activity; import android.app.ExpandableListActivity; import android.os.Bundle; import android.transition.SidePropagation; import android.widget.SimpleExpandableListAdapter; public class MainActivity extends ExpandableListActivity { private static final String NAME = "NAME"; private static final String IS_EVEN = "IS_EVEN"; private SimpleExpandableListAdapter eListAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); List<Map<String, String>> groupData = new ArrayList<Map<String, String>>(); List<List<Map<String, String>>> childDataList = new ArrayList<List<Map<String, String>>>(); for (int i = 0; i < 10; 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 < 8; j++) { Map<String, String> curChildMap = new HashMap<String, String>(); children.add(curChildMap); curChildMap.put(NAME, "Child" + i); curChildMap.put(IS_EVEN, (i % 2 == 0) ? "This chile is even" : "this chile is odd"); } childDataList.add(children); } eListAdapter = new SimpleExpandableListAdapter(this, groupData, android.R.layout.simple_expandable_list_item_2, new String[] { NAME, IS_EVEN }, new int[] { android.R.id.text1, android.R.id.text2 }, childDataList, android.R.layout.simple_expandable_list_item_2, new String[] { NAME, IS_EVEN }, new int[] { android.R.id.text1, android.R.id.text2 }); setListAdapter(eListAdapter); } }
1、groupData是父数据 ,childDataList是子数据。
2、android.R.layout.simple_expandable_list_item_2表示list的实现方式
3、new String[] { NAME,IS_EVEN} list需要显示的数据的键值,真正显示的是键对应的值
效果图:
二、数据源:SimpleCursorTreeAdapter的使用
package com.example.explear; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import android.app.Activity; import android.app.ExpandableListActivity; import android.content.ContentUris; import android.content.Context; import android.database.Cursor; import android.net.Uri; import android.os.Bundle; import android.provider.Contacts.People; import android.transition.SidePropagation; import android.widget.ExpandableListAdapter; import android.widget.SimpleCursorTreeAdapter; import android.widget.SimpleExpandableListAdapter; public class MainActivity extends ExpandableListActivity { private int mGroupIdColumnIndex; private String mPhoneNumberProjection[] = new String[] { People.Phones._ID, People.Phones.NUMBER }; private ExpandableListAdapter mAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 搜索 Cursor groupCursor = managedQuery(People.CONTENT_URI, new String[] { People._ID, People.NAME }, null, null, null); // 创建ID 列索引 mGroupIdColumnIndex = groupCursor.getColumnIndexOrThrow(People._ID); // 创建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 }, new int[] { android.R.id.text1 }, new String[] { People.NUMBER }, 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) { // 传进来一个组,返回一个对组内所有子组的cursor // 返回一个指向这个联系人电话的箭头 Uri.Builder builder = People.CONTENT_URI.buildUpon(); ContentUris.appendId(builder, groupCursor.getLong(mGroupIdColumnIndex)); builder.appendEncodedPath(People.Phones.CONTENT_DIRECTORY); Uri phoneNumberUri = builder.build(); return managedQuery(phoneNumberUri, mPhoneNumberProjection, null, null, null); } } }
效果图
三、通过BaseExpandableListAdapter绑定数据
activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context="com.example.explear.MainActivity" > <TextView android:id="@+id/textView1" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="TextView" /> <ExpandableListView android:id="@android:id/list" android:layout_width="match_parent" android:layout_height="0dp" android:layout_weight="1" > </ExpandableListView> </LinearLayout>
注意这里的ExpandableListView的id设置需要使用@android:id/list,否则会报
Your content must have a ExpandableListView whose id attribute is 'android.R.id.list'错误
package com.example.explear; import android.R.anim; import android.app.ExpandableListActivity; import android.os.Bundle; import android.view.Gravity; import android.view.View; import android.view.ViewGroup; import android.widget.AbsListView; import android.widget.BaseExpandableListAdapter; import android.widget.ExpandableListView; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; public class MainActivity extends ExpandableListActivity { private String[] groups = { "group1", "group2", "group3", "group4" }; private String[][] children = { { "g1 item1", "g1 item2", "g1 item3", "g1 item4" }, { "g2 item1", "g2 item2", "g2 item3", "g2 item4" }, { "g3 item1", "g3 item2" }, { "g4 item1", "g4 item2" } }; private ExpandableListView expandableListView; private TextView tView = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tView = (TextView) findViewById(R.id.textView1); expandableListView = (ExpandableListView) findViewById(android.R.id.list); BaseExpandableListAdapter adapter = new BaseExpandableListAdapter() { @Override public boolean isChildSelectable(int groupPosition, int childPosition) { String string = groups[groupPosition] + children[groupPosition][childPosition]; tView.setText(string); return true; } @Override public boolean hasStableIds() { return false; } @Override public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { LinearLayout layout = new LinearLayout(MainActivity.this); layout.setOrientation(0); layout.setPadding(50, 0, 0, 0); ImageView imageView = new ImageView(MainActivity.this); imageView.setImageResource(R.drawable.ic_launcher); layout.addView(imageView); TextView textView = getTextView(); textView.setText(getGroup(groupPosition).toString()); layout.addView(textView); return layout; } @Override public long getGroupId(int groupPosition) { return groupPosition; } @Override public int getGroupCount() { return groups.length; } @Override public Object getGroup(int groupPosition) { return groups[groupPosition]; } @Override public int getChildrenCount(int groupPosition) { return children[groupPosition].length; } @Override public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { TextView textView = getTextView(); textView.setText(getChild(groupPosition, childPosition) .toString()); return textView; } @Override public long getChildId(int groupPosition, int childPosition) { return childPosition; } @Override public Object getChild(int groupPosition, int childPosition) { return children[groupPosition][childPosition]; } }; expandableListView.setAdapter(adapter); } protected TextView getTextView() { AbsListView.LayoutParams lParams = new AbsListView.LayoutParams( ViewGroup.LayoutParams.MATCH_PARENT, 64); TextView textView = new TextView(MainActivity.this); textView.setLayoutParams(lParams); textView.setPadding(20, 0, 0, 0); textView.setGravity(Gravity.LEFT | Gravity.CENTER_VERTICAL); return textView; } }
效果图: