《Android 平板电脑开发实战详解和典型案例》——2.6节可展开列表—— ExpandableListView

简介:

本节书摘来自异步社区《Android 平板电脑开发实战详解和典型案例》一书中的第2章,第2.6节可展开列表—— ExpandableListView,作者 吴亚峰 , 杜化美 , 索依娜,更多章节内容可以访问云栖社区“异步社区”公众号查看

2.6 可展开列表—— ExpandableListView
Android 平板电脑开发实战详解和典型案例
上一节中介绍了NumberPicker的基本知识及简单案例,本节将介绍Android 2.0控件可扩展列表ExpandableListView,主要内容包括其基本知识以及一个简单的案例。

2.6.1 可展开列表基本知识
可展开列表ExpandableListView在主界面显示的效果就是下拉菜单。当单击可展开列表ExpandableListView时会弹出一个子菜单,当再单击时界面就会恢复,使主界面节省很大的空间。可扩展列表ExpandableListView继承自ListView,其继承树如图2-28所示。


dc2721c387bdeaac4afe682c62a858e4bada18f8

对菜单资源中的其他属性,由于篇幅所限,笔者将不再一一赘述,请读者自行查阅相关的API。

2.6.2 可展开列表使用案例
通过前面的基本知识,读者对可扩展列表的基本知识已经有了简单的了解,下面通过案例Sample2_8使读者进一步掌握可扩展列表的使用,在正式介绍此案例的开发步骤之前首先请读者了解一下本案例的运行效果,如图2-29、图2-30和图2-31所示。


4f83015ff5a267db0784c190c901ae8c2ca996f1

图2-29为程序运行效果图,单击菜单会出现图2-30、图2-31的效果。
了解了案例的运行结果之后,下面开始介绍案例的开发,具体步骤如下。

(1)首先需要编写的是主配置文件main.xml,其代码如下。

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="fill_parent"       <!--充满父控件-->
5   android:orientation="vertical" >        <!--垂直放置-->
6  <ExpandableListView              
7   android:id="@+id/android_list"          <!--设置ID-->
8    android:layout_width=”500dip"          <!--设置宽度-->
9    android:layout_height="600dip"         <!--设置高度-->    
10   android:layout_weight="1"         
11   android:drawSelectorOnTop="false"/>  
12 </LinearLayout>

该布局比较简单,在一个充满屏幕的LinearLayout中放了一个放置可展开列表ExpandableListView,单击可展开列表中的选项后可显示子列表。
(2)完成了配置文件main.xml的开发后,下面将要开发的是主Activity对应的类ExpandlActivity,其代码如下。

1  package com.bn.sample2_8;         //声明包
2  ……//该处省略了部分类的导入代码,读者可自行查看随书光盘中的源代码
3 public class ExpandlActivity extends ExpandableListActivity {  
4   private ExpandableListAdapter mAdapter;     //声明adapter  
6  @Override   
7  protected void onCreate(Bundle savedInstanceState) {super.onCreate (savedInstanceState);
8     mAdapter = new MyExpandableListAdapter();    //实例化adapter
9     setListAdapter(mAdapter);        //为列表设置adapter
10     registerForContextMenu(this.getExpandableListView());}  //为list注册context
菜单    
11  @Override           //重写父类方法,当孩子被单击时调用
12  public boolean onChildClick(ExpandableListView parent, View v,  
13     int groupPosition, int childPosition, long id) { Toast.makeText(this, " 组元素索引: " +
14  groupPosition + " 子元素索引: " +     //显示一个Toast
15  childPosition, Toast.LENGTH_SHORT).show();  
16   return super.onChildClick(parent, v, groupPosition, childPosition, id);}  
17  @Override           //重写父类 方法,当组被单击时调用
18  public void onGroupExpand(int groupPosition) { Toast.makeText(this, " 组元素索引: " + 
//显示一个Toast
19  groupPosition, Toast.LENGTH_SHORT).show();  
20     super.onGroupExpand(groupPosition);}   
21  @Override            //上下文菜单创建时调用
22 public void onCreateContextMenu(ContextMenu menu, View v,  
23     ContextMenuInfo menuInfo) { menu.setHeaderTitle("上下文菜单");       
24   menu.add(0, 0, 0, "单击我");}  
25 @Override            //单击上下文菜单后的逻辑  
26 public boolean onContextItemSelected(MenuItem item) { 
27   ExpandableListContextMenuInfo info = (ExpandableListContextMenuInfo)//获得给定菜单项的信息
28  item.getMenuInfo();  
29    String title = ((TextView) info.targetView).getText().toString();  
30    int type = ExpandableListView.getPackedPositionType(info.packedPosition);    //获取给定的位置的类    
31  if (type == ExpandableListView.PACKED_POSITION_TYPE_CHILD) {
32    int groupPos = ExpandableListView.getPackedPositionGroup(info.packedPosition);
33  int childPos = ExpandableListView.getPackedPositionChild(info.packedPosition);
34    Toast.makeText(this, title + " 组元素索引: " +  //显示一个Toast
35  groupPos + " 子元素索引: " + childPos, Toast.LENGTH_SHORT).show(); return true;}
36  else if(type == ExpandableListView.PACKED_POSITION_TYPE_GROUP){  
37  int groupPos = ExpandableListView.getPackedPositionGroup(info.packed Position);
38  Toast.makeText(this, title + " 组元素索引: " +    //显示一个Toast
39  groupPos, Toast.LENGTH_SHORT).show();return true;}return false;}   
40 class MyExpandableListAdapter extends BaseExpandableListAdapter { //自定义Adapter 
41   private String[] groups ={"我的好友","我的同学","我的家人","陌生人"}; //父列表数据
42  private String[][] children ={{ "小红","小丽","小明" },{"王强","李四" },   //子列表数据
43  { "爸爸", "妈妈", "妹妹" },{ "陌生人1", "陌生人2" }};         
44  public Object getChild(int groupPosition, int childPosition) { //返回指定位置的孩子
45    return children[groupPosition][childPosition];}  
46  public long getChildId(int groupPosition, int childPosition) {//获取与在给定组给定孩子的相关的数据
47     return childPosition;}   
48     public int getChildrenCount(int groupPosition) {  //返回在指定组的孩子数目
49     return children[groupPosition].length;}  
50   public View getChildView(int groupPosition, int childPosition, //取子列表中的某一项的 View 
51      boolean isLastChild, View convertView, ViewGroup parent) { 
52     TextView textView = getGenericView();//取得TextView的引用
53       text.setTextSize(40);
54        text.setTextColor(ExpandlActivity.this.getResources().getColor(R.color.white); 
55     textView.setText(getChild(groupPosition, childPosition).toString());//设置TextView中显示的文字 
56     return textView;}
57    public Object getGroup(int groupPosition) { return groups[groupPosition];}   
58     public int getGroupCount() { return groups.length;}  //返回父列表的长度 
59    public long getGroupId(int groupPosition) { return groupPosition;} //返回父列表指定项的位置编号
60    public View getGroupView(int groupPosition, boolean isExpanded, //取父列表中的某一项的 View 
61    View convertView, ViewGroup parent) { TextView textView = getGenericView();
62      text.setTextSize(40);
63     text.setTextColor(ExpandlActivity.this.getResources().getColor(R.color.white);
64    textView.setText(getGroup(groupPosition).toString());  
65       return textView;}  
66    public boolean hasStableIds() { return true;} //判断指示项ID是否稳定是整个基础数据的更改
67    public boolean isChildSelectable(
68   int groupPosition, int childPosition){ return true;} //判断指定位置的子项是否可以被选择   
69  private TextView getGenericView() {           //获取某一项的 View 的逻辑
70     AbsListView.LayoutParams lp = new AbsListView.LayoutParams(  
71     ViewGroup.LayoutParams.FILL_PARENT, 48);  
72      TextView textView = new TextView(ExpandlActivity.this); 
73   textView.setLayoutParams(lp);              //设置布局参数
74   textView.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT);  
75   textView.setPadding(32, 0, 0, 0);            //设置四周留白
76   return textView; }}}

第11~16行为当孩子被单击时调用,显示一个Toast。第17~20行为当组被单击时调用,显示一个Toast。第21~24行为上下文菜单创建时调用。
第25~39行为单击上下文菜单后的逻辑,第27~30行为获取给定菜单项的信息和给定位置的类型。第31~39行为按类型的不同显示不同的Toast。
第40~76行为自定义一个Adapter,其中第41~43行为父列表和子列表设置数据。第44~76行为获取View的逻辑。

相关文章
|
5月前
|
存储 数据库 Android开发
安卓Jetpack Compose+Kotlin,支持从本地添加音频文件到播放列表,支持删除,使用ExoPlayer播放音乐
为了在UI界面添加用于添加和删除本地音乐文件的按钮,以及相关的播放功能,你需要实现以下几个步骤: 1. **集成用户选择本地音乐**:允许用户从设备中选择音乐文件。 2. **创建UI按钮**:在界面中创建添加和删除按钮。 3. **数据库功能**:使用Room数据库来存储音频文件信息。 4. **更新ViewModel**:处理添加、删除和播放音频文件的逻辑。 5. **UI实现**:在UI层支持添加、删除音乐以及播放功能。
|
4月前
|
Java Android开发 Spring
Android Spingboot 实现SSE通信案例
【7月更文挑战第14天】以下是使用Android和Spring Boot实现SSE(Server-Sent Events)通信的案例摘要: 在`MainActivity`中: - 初始化界面元素并设置按钮点击事件。 - `startSseRequest`方法创建`WebClient`对象,设置请求头,发送请求,并处理响应和错误。 请确保将`your-server-url`替换为实际的服务器地址。
121 14
|
4月前
|
Java Android开发 C++
🚀Android NDK开发实战!Java与C++混合编程,打造极致性能体验!📊
【7月更文挑战第28天】在 Android 开发中, NDK 让 Java 与 C++ 混合编程成为可能, 从而提升应用性能。**为何选 NDK?** C++ 在执行效率与内存管理上优于 Java, 特别适合高性能需求场景。**环境搭建** 需 Android Studio 和 NDK, 工具如 CMake。**JNI** 构建 Java-C++ 交互, 通过声明 `native` 方法并在 C++ 中实现。**实战** 示例: 使用 C++ 计算斐波那契数列以提高效率。**总结** 混合编程增强性能, 但增加复杂性, 使用前需谨慎评估。
141 4
|
3月前
|
Android开发 开发者 UED
Android项目架构设计问题之加载数据到列表如何解决
Android项目架构设计问题之加载数据到列表如何解决
34 0
|
5月前
|
JSON Java API
【Android】使用 Retrofit2 发送异步网络请求的简单案例
**摘要:** Retrofit是Android和Java的HTTP客户端库,简化了RESTful API交互。它通过Java接口定义HTTP请求,并提供注解管理参数、HTTP方法等。要使用Retrofit,首先在AndroidManifest.xml中添加`INTERNET`权限,然后在`build.gradle`中引入Retrofit和Gson依赖。创建服务器响应数据类和描述接口的接口,如`Result`和`Api`。通过Retrofit.Builder配置基础URL并构建实例,之后调用接口方法创建Call对象并发送异步请求。
212 1
|
5月前
|
存储 API Android开发
29. 【Android教程】折叠列表 ExpandableListView
29. 【Android教程】折叠列表 ExpandableListView
505 2
|
5月前
|
前端开发 API Android开发
25. 【Android教程】列表控件 ListView
25. 【Android教程】列表控件 ListView
176 2
|
5月前
|
安全 Java API
Android获取Wi-Fi网络列表
【6月更文挑战第21天】
|
6月前
|
Android开发
Android获取蓝牙设备列表的方法
Android获取蓝牙设备列表的方法
537 5
|
6月前
|
Android开发
Android 获取 USB设备列表
Android 获取 USB设备列表 【5月更文挑战第6天】
186 4