Android ExpandableListActivity 学习笔记(转载)

本文详细介绍了Android中的ExpandableList组件,包括如何使用SimpleExpandableListAdapter、SimpleCursorTreeAdapter及BaseExpandableListAdapter三种方式来绑定数据,并展示了具体的实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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. }
资源下载链接为: https://pan.quark.cn/s/abbae039bf2a 无锡平芯微半导体科技有限公司生产的A1SHB三极管(全称PW2301A)是一款P沟道增强型MOSFET,具备低内阻、高重复雪崩耐受能力以及高效电源切换设计等优势。其技术规格如下:最大漏源电压(VDS)为-20V,最大连续漏极电流(ID)为-3A,可在此条件下稳定工作;栅源电压(VGS)最大值为±12V,能承受正反向电压;脉冲漏极电流(IDM)可达-10A,适合处理短暂高电流脉冲;最大功率耗散(PD)为1W,可防止器件过热。A1SHB采用3引脚SOT23-3封装,小型化设计利于空间受限的应用场景。热特性方面,结到环境的热阻(RθJA)为125℃/W,即每增加1W功率损耗,结温上升125℃,提示设计电路时需考虑散热。 A1SHB的电气性能出色,开关特性优异。开关测试电路及波形图(图1、图2)展示了不同条件下的开关性能,包括开关上升时间(tr)、下降时间(tf)、开启时间(ton)和关闭时间(toff),这些参数对评估MOSFET在高频开关应用中的效率至关重要。图4呈现了漏极电流(ID)与漏源电压(VDS)的关系,图5描绘了输出特性曲线,反映不同栅源电压下漏极电流的变化。图6至图10进一步揭示性能特征:转移特性(图7)显示栅极电压(Vgs)对漏极电流的影响;漏源开态电阻(RDS(ON))随Vgs变化的曲线(图8、图9)展现不同控制电压下的阻抗;图10可能涉及电容特性,对开关操作的响应速度和稳定性有重要影响。 A1SHB三极管(PW2301A)是高性能P沟道MOSFET,适用于低内阻、高效率电源切换及其他多种应用。用户在设计电路时,需充分考虑其电气参数、封装尺寸及热管理,以确保器件的可靠性和长期稳定性。无锡平芯微半导体科技有限公司提供的技术支持和代理商服务,可为用户在产品选型和应用过程中提供有
资源下载链接为: https://pan.quark.cn/s/9648a1f24758 在 JavaScript 中实现点击展开与隐藏效果是一种非常实用的交互设计,它能够有效提升用户界面的动态性和用户体验。本文将详细阐述如何通过 JavaScript 实现这种功能,并提供一个完整的代码示例。为了实现这一功能,我们需要掌握基础的 HTML 和 CSS 知识,以便构建基本的页面结构和样式。 在这个示例中,我们有一个按钮和一个提示框(prompt)。默认情况下,提示框是隐藏的。当用户点击按钮时,提示框会显示出来;再次点击按钮时,提示框则会隐藏。以下是 HTML 部分的代码: 接下来是 CSS 部分。我们通过设置提示框的 display 属性为 none 来实现默认隐藏的效果: 最后,我们使用 JavaScript 来处理点击事件。我们利用事件监听机制,监听按钮的点击事件,并通过动态改变提示框的 display 属性来实现展开和隐藏的效果。以下是 JavaScript 部分的代码: 为了进一步增强用户体验,我们还添加了一个关闭按钮(closePrompt),用户可以通过点击该按钮来关闭提示框。以下是关闭按钮的 JavaScript 实现: 通过以上代码,我们就完成了点击展开隐藏效果的实现。这个简单的交互可以通过添加 CSS 动画效果(如渐显渐隐等)来进一步提升用户体验。此外,这个基本原理还可以扩展到其他类似的交互场景,例如折叠面板、下拉菜单等。 总结来说,JavaScript 实现点击展开隐藏效果主要涉及 HTML 元素的布局、CSS 的样式控制以及 JavaScript 的事件处理。通过监听点击事件并动态改变元素的样式,可以实现丰富的交互功能。在实际开发中,可以结合现代前端框架(如 React 或 Vue 等),将这些交互封装成组件,从而提高代码的复用性和维护性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值