Android ExpandableListView的使用
一、MainActivity要繼承ExpandableListActivity。效果是當單機ListView的子項是顯示另一個ListView。
public class MainActivity extends ExpandableListActivity {private static final String NAME = "NAME";private static final String IS_EVEN = "IS_EVEN";private ExpandableListAdapter eListAdapter;@Overrideprotected 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" + j);curChildMap.put(IS_EVEN, (j % 2 == 0) ? "This child is even" : "This child 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需要顯示的資料。
:
也就是單機Group2時,顯示Group2的資料。
二、資料來源:SimpleCursorTreeAdapter的使用
顯示通訊錄中的姓名,單擊用姓名,顯示號碼。前提還要分配讀取通訊錄的許可權
<uses-permission android:name="android.permission.READ_CONTACTS"/>
代碼如下:
public class ExpandableList2 extends ExpandableListActivity { private int mGroupIdColumnIndex; private String mPhoneNumberProjection[] = new String[] { People.Phones._ID, People.Phones.NUMBER }; private ExpandableListAdapter mAdapter; @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); } }
三、通過BaseExpandableListAdapter綁定資料
1.BaseExpandableListAdapter
public class ExpandableList3 extends Activity { 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" } }; //ExpandableListAdapter mAdapter; private ExpandableListView expandableListView; private TextView tView = null; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); tView = (TextView)findViewById(R.id.textView1); expandableListView = (ExpandableListView)findViewById(R.id.expandableListView1); ExpandableListAdapter adapter = new BaseExpandableListAdapter() { @Overridepublic boolean isChildSelectable(int groupPosition, int childPosition) {// TODO Auto-generated method stubString string = groups[groupPosition] + children[groupPosition][childPosition];tView.setText(string);return true;}@Overridepublic boolean hasStableIds() {// TODO Auto-generated method stubreturn true;}@Overridepublic View getGroupView(int groupPosition, boolean isExpanded,View convertView, ViewGroup parent) {// TODO Auto-generated method stubLinearLayout layout = new LinearLayout(ExpandableList3.this);layout.setOrientation(0);layout.setPadding(50, 0, 0, 0);ImageView imageView = new ImageView(ExpandableList3.this);imageView.setImageResource(R.drawable.ic_launcher);layout.addView(imageView);TextView textView = getTextView();textView.setText(getGroup(groupPosition).toString());layout.addView(textView);return layout;}private TextView getTextView() {// TODO Auto-generated method stubAbsListView.LayoutParams lParams = new AbsListView.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, 64);TextView textView = new TextView(ExpandableList3.this);textView.setLayoutParams(lParams);textView.setPadding(20, 0, 0, 0);textView.setGravity(Gravity.LEFT | Gravity.CENTER_VERTICAL);return textView;}@Overridepublic long getGroupId(int groupPosition) {// TODO Auto-generated method stubreturn groupPosition;}@Overridepublic int getGroupCount() {// TODO Auto-generated method stubreturn groups.length;}@Overridepublic Object getGroup(int groupPosition) {// TODO Auto-generated method stubreturn groups[groupPosition];}@Overridepublic int getChildrenCount(int groupPosition) {// TODO Auto-generated method stubreturn children[groupPosition].length;}@Overridepublic View getChildView(int groupPosition, int childPosition,boolean isLastChild, View convertView, ViewGroup parent) {// TODO Auto-generated method stubTextView textView = getTextView();textView.setText(getChild(groupPosition, childPosition).toString());return textView;}@Overridepublic long getChildId(int groupPosition, int childPosition) {// TODO Auto-generated method stubreturn childPosition;}@Overridepublic Object getChild(int groupPosition, int childPosition) {// TODO Auto-generated method stubreturn children[groupPosition][childPosition];}}; expandableListView.setAdapter(adapter); } }
:點擊子項時,顯示子項的資訊。
2.資料來源寫一個類MyExpandableListAdapter,該類繼承自 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 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; } } }
: