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

news/2025/2/12 18:41:37

本节书摘来自异步社区《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的逻辑。


https://dhexx.cn/news/show-2510074.html

相关文章

嵌套类与局部类

一、嵌套类 在一个类的内部定义另一个类&#xff0c;我们称之为嵌套类&#xff08;nested class&#xff09;&#xff0c;或者嵌套类型。之所以引入这样一个嵌套类&#xff0c;往往是因为外围类需要使用嵌套类对象作为底层实现&#xff0c;并且该嵌套类只用于外围类的实现&…

DBA避坑宝典:Oracle运维中的那些事儿

对于Oracle运维中的那些事儿&#xff0c;我的最终目的&#xff1a;不是比谁更惨&#xff0c;而是能够从中吸取经验和教训。 从我的理解来看&#xff0c;我会从下面的几个方面来进行说明DBA运维中的一些事儿。 每个部分都是非常关键的&#xff0c;缺一不可&#xff0c;而且每一部…

再论空指针检测问题

某些C/C编程的书中,曾经提到如何判断指针是否为空的问题.很显然,if (p NULL), if (p 0) 和if(p),都能够完成这一任务,差别在于可读性方面.我们分别加以讨论. 1. if (p NULL) 相当多的文章建议采用,他们中的部分人甚至认为,其他做法都是错误的.这个形式一个变种是 if (NULL …

车联网V2X介绍之:通信芯片

车联网V2X介绍之&#xff1a;通信芯片 参考链接&#xff1a;https://zhuanlan.zhihu.com/p/115276002 目前&#xff0c;我国产业化进程逐步加快&#xff0c;产业链上下游企业已经围绕LTE-V2X形成包括通信芯片、通信模组、终端设备、整车制造、运营服务、测试认证、高精度定位及…

《SQL入门经典(第5版)》一一1.6 问与答

本节书摘来自异步社区出版社《SQL入门经典&#xff08;第5版&#xff09;》一书中的第1章&#xff0c;第1.6节&#xff0c;作者&#xff1a;【美】Ryan Stephens , Ron Plew , Arie D.Jones&#xff0c;更多章节内容可以访问云栖社区“异步社区”公众号查看。 1.6 问与答 SQL入…

看V2X标准之争,美国/欧洲/日本/中国如何布局车联网?

看V2X标准之争&#xff0c;美国/欧洲/日本/中国如何布局车联网&#xff1f; 参考链接&#xff1a;https://www.ednchina.com/news/20170411V2X.html 中国信息通信研究院副主任汤立波博士在近日“智能交通和安全车联网的未来之路”中分享了车联网的整个产业链&#xff0c;以及…

网络序、大端与小端问题

网络序、大端与小端 简单说&#xff0c; 小端就是把低字节存放在低地址&#xff1b; 大端就是把高字节存放在低地址&#xff1b; 为了防止网络传输数据在不同CPU平台上出现字节序不一样的情况&#xff0c; UPD/TCP/IP协议规定&#xff1a;网络字节序采用大端字节序。具体规定为…

V2X主要用到什么技术?

V2X主要用到什么技术? 参考链接:https://www.zhihu.com/question/56755587 主要是两种技术。1、基于802.11的DSRC(Dedicated Short Range Communication)(专用短距离通信)解决方案,使用5.9GHz频段。 美国交通部有计划在2019年之后强制在汽车上安装DSRC模块。有关DSRC的试…

虚拟内存、物理内存、页面文件和任务管理器介绍

虚拟内存、物理内存、页面文件和任务管理器介绍 : 虚拟内存&#xff08;Virtual Memory&#xff09;是Windows管理所有可用内存的方式。 : 对于32位Windows系统&#xff0c;每个进程所用到的虚拟内存地址从0到2^32-1&#xff0c;总容量4GB&#xff0c; : 其中2GB是与操作系统以…

Nginx HTTPS功能部署实践

本文出处&#xff1a;http://oldboy.blog.51cto.com/2561410/1889346 30.1 文档目的 本文目的提高自己文档的写作能力及排版能力,加强上课所讲的内容得以锻炼也方便自己以后查阅特写此文档。 30.2 文档内容 本章内容包括:单向和双向认证的概念、openssl的介绍、Nginx单向ssl的配…