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绑定数据:

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. }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值