Android ExpandableListActivity 学习札记(转载)
Android 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绑定数据:
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绑定数据:
1. public class ExpandableList3 extends ExpandableListActivity { 2. private static final String NAME = "NAME"; 3. private static final String IS_EVEN = "IS_EVEN"; 4. 5. private ExpandableListAdapter mAdapter; 6. 7. @Override 8. public void onCreate(Bundle savedInstanceState) { 9. super.onCreate(savedInstanceState); 10. 11. List<Map<String, String>> groupData = new ArrayList<Map<String, String>>(); 12. List<List<Map<String, String>>> childData = new ArrayList<List<Map<String, String>>>(); 13. for (int i = 0; i < 20; i++) { 14. Map<String, String> curGroupMap = new HashMap<String, String>(); 15. groupData.add(curGroupMap); 16. curGroupMap.put(NAME, "Group " + i); 17. curGroupMap.put(IS_EVEN, (i % 2 == 0) ? "This group is even" : "This group is odd"); 18. 19. List<Map<String, String>> children = new ArrayList<Map<String, String>>(); 20. for (int j = 0; j < 15; j++) { 21. Map<String, String> curChildMap = new HashMap<String, String>(); 22. children.add(curChildMap); 23. curChildMap.put(NAME, "Child " + j); 24. curChildMap.put(IS_EVEN, (j % 2 == 0) ? "This child is even" : "This child is odd"); 25. } 26. childData.add(children); 27. } 28. 29. // Set up our adapter 30. mAdapter = new SimpleExpandableListAdapter( 31. this, 32. groupData, // 存储父list的数据 33. android.R.layout.simple_expandable_list_item_2, //父list的现实方式 34. new String[] { NAME,IS_EVEN}, // 父list需要显示的数据 35. new int[] { android.R.id.text1,android.R.id.text2}, // 父list的数据绑定到的view 36. childData, //子list的数据 37. android.R.layout.simple_expandable_list_item_2, 38. new String[] { NAME, IS_EVEN }, 39. new int[] { android.R.id.text1, android.R.id.text2 } 40. ); 41. setListAdapter(mAdapter); 42. } 43. 44. }
注意: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中)文件的布局如下:
1. <?xml version="1.0" encoding="utf-8"?> 2. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 3. android:layout_width="fill_parent" 4. android:layout_height="wrap_content" 5. android:orientation="vertical"> 6. 7. <TextView android:id="@+id/text1" 8. android:textSize="16sp" 9. android:textStyle="bold" 10. android:layout_width="fill_parent" 11. android:layout_height="wrap_content"/> 12. 13. <TextView android:id="@+id/text2" 14. android:textSize="16sp" 15. android:layout_width="fill_parent" 16. android:layout_height="wrap_content"/> 17. </LinearLayout>
示例2—通过SimpleCussorTreeAdapter绑定数据:
# 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); # } # # } # }
示例3—通过BaseExpandableListAdapter绑定数据:
1. public class ExpandableList1 extends ExpandableListActivity { 2. 3. ExpandableListAdapter mAdapter; 4. 5. @Override 6. public void onCreate(Bundle savedInstanceState) { 7. super.onCreate(savedInstanceState); 8. 9. // Set up our adapter 10. mAdapter = new MyExpandableListAdapter(); 11. setListAdapter(mAdapter); 12. // register context menu, when long click the item, it will show a dialog 13. registerForContextMenu(getExpandableListView()); 14. } 15. 16. @Override 17. public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) { 18. menu.setHeaderTitle("Sample menu"); 19. menu.add(0, 0, 0, R.string.expandable_list_sample_action); 20. } 21. 22. @Override 23. public boolean onContextItemSelected(MenuItem item) { 24. ExpandableListContextMenuInfo info = (ExpandableListContextMenuInfo) item.getMenuInfo(); 25. 26. String title = ((TextView) info.targetView).getText().toString(); 27. 28. int type = ExpandableListView.getPackedPositionType(info.packedPosition); 29. if (type == ExpandableListView.PACKED_POSITION_TYPE_CHILD) { 30. int groupPos = ExpandableListView.getPackedPositionGroup(info.packedPosition); 31. int childPos = ExpandableListView.getPackedPositionChild(info.packedPosition); 32. Toast.makeText(this, title + ": Child " + childPos + " clicked in group " + groupPos, 33. Toast.LENGTH_SHORT).show(); 34. return true; 35. } else if (type == ExpandableListView.PACKED_POSITION_TYPE_GROUP) { 36. int groupPos = ExpandableListView.getPackedPositionGroup(info.packedPosition); 37. Toast.makeText(this, title + ": Group " + groupPos + " clicked", Toast.LENGTH_SHORT).show(); 38. return true; 39. } 40. 41. return false; 42. } 43. 44. /** 45. * A simple adapter which maintains an ArrayList of photo resource Ids. 46. * Each photo is displayed as an image. This adapter supports clearing the 47. * list of photos and adding a new photo. 48. * 49. */ 50. public class MyExpandableListAdapter extends BaseExpandableListAdapter { 51. // Sample data set. children[i] contains the children (String[]) for groups[i]. 52. private String[] groups = { "People Names", "Dog Names", "Cat Names", "Fish Names" }; 53. private String[][] children = { 54. { "Arnold", "Barry", "Chuck", "David" }, 55. { "Ace", "Bandit", "Cha-Cha", "Deuce" }, 56. { "Fluffy", "Snuggles" }, 57. { "Goldy", "Bubbles" } 58. }; 59. 60. public Object getChild(int groupPosition, int childPosition) { 61. return children[groupPosition][childPosition]; 62. } 63. 64. public long getChildId(int groupPosition, int childPosition) { 65. return childPosition; 66. } 67. 68. public int getChildrenCount(int groupPosition) { 69. return children[groupPosition].length; 70. } 71. 72. public TextView getGenericView() { 73. // Layout parameters for the ExpandableListView 74. AbsListView.LayoutParams lp = new AbsListView.LayoutParams( 75. ViewGroup.LayoutParams.FILL_PARENT, 64); 76. 77. TextView textView = new TextView(ExpandableList1.this); 78. textView.setLayoutParams(lp); 79. // Center the text vertically 80. textView.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT); 81. // Set the text starting position 82. textView.setPadding(36, 0, 0, 0); 83. return textView; 84. } 85. 86. public View getChildView(int groupPosition, int childPosition, boolean isLastChild, 87. View convertView, ViewGroup parent) { 88. TextView textView = getGenericView(); 89. textView.setText(getChild(groupPosition, childPosition).toString()); 90. return textView; 91. } 92. 93. public Object getGroup(int groupPosition) { 94. return groups[groupPosition]; 95. } 96. 97. public int getGroupCount() { 98. return groups.length; 99. } 100. 101. public long getGroupId(int groupPosition) { 102. return groupPosition; 103. } 104. 105. public View getGroupView(int groupPosition, boolean isExpanded, View convertView, 106. ViewGroup parent) { 107. TextView textView = getGenericView(); 108. textView.setText(getGroup(groupPosition).toString()); 109. return textView; 110. } 111. 112. public boolean isChildSelectable(int groupPosition, int childPosition) { 113. return true; 114. } 115. 116. public boolean hasStableIds() { 117. return true; 118. } 119. 120. } 121. }