热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

本节书摘来自异步社区《Android平板电脑开发实战详解和典型案例》一书中的第2章,第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
2 3 android:layout_width="fill_parent"        
4  android:layout_height="fill_parent"      
5   android:orientation="vertical" >        
6  7 android:id="@+id/android_list"          
8  android:layout_width=”500dip"         
9  android:layout_height="600dip"            
10  android:layout_weight="1"        
11  android:drawSelectorOnTop="false"/>  
12

该布局比较简单,在一个充满屏幕的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的逻辑。



推荐阅读
  • 本文探讨了资源访问的学习路径与方法,旨在帮助学习者更高效地获取和利用各类资源。通过分析不同资源的特点和应用场景,提出了多种实用的学习策略和技术手段,为学习者提供了系统的指导和建议。 ... [详细]
  • 技术分享:深入解析GestureDetector手势识别机制
    技术分享:深入解析GestureDetector手势识别机制 ... [详细]
  • 掌握Android UI设计:利用ZoomControls实现图片缩放功能
    本文介绍了如何在Android应用中通过使用ZoomControls组件来实现图片的缩放功能。ZoomControls提供了一种简单且直观的方式,让用户可以通过点击放大和缩小按钮来调整图片的显示大小。文章详细讲解了ZoomControls的基本用法、布局设置以及与ImageView的结合使用方法,适合初学者快速掌握Android UI设计中的这一重要功能。 ... [详细]
  • 为了优化直播应用底部聊天框的弹出机制,确保在不同设备上的布局稳定性和兼容性,特别是在配备虚拟按键的设备上,我们对用户交互流程进行了调整。首次打开应用时,需先点击首个输入框以准确获取键盘高度,避免直接点击第二个输入框导致的整体布局挤压问题。此优化通过调整 `activity_main.xml` 布局文件实现,确保了更好的用户体验和界面适配。 ... [详细]
  • 本文介绍如何在 Android 中自定义加载对话框 CustomProgressDialog,包括自定义 View 类和 XML 布局文件的详细步骤。 ... [详细]
  • 本文介绍了一种自定义的Android圆形进度条视图,支持在进度条上显示数字,并在圆心位置展示文字内容。通过自定义绘图和组件组合的方式实现,详细展示了自定义View的开发流程和关键技术点。示例代码和效果展示将在文章末尾提供。 ... [详细]
  • 在处理 XML 数据时,如果需要解析 `` 标签的内容,可以采用 Pull 解析方法。Pull 解析是一种高效的 XML 解析方式,适用于流式数据处理。具体实现中,可以通过 Java 的 `XmlPullParser` 或其他类似的库来逐步读取和解析 XML 文档中的 `` 元素。这样不仅能够提高解析效率,还能减少内存占用。本文将详细介绍如何使用 Pull 解析方法来提取 `` 标签的内容,并提供一个示例代码,帮助开发者快速解决问题。 ... [详细]
  • 利用Python与Android进行高效移动应用开发
    通过结合Python和Android,可以实现高效的移动应用开发。首先,需要安装Scripting Layer for Android (SL4A),这是一个开源项目,旨在为Android系统提供脚本语言支持。SL4A不仅简化了开发流程,还允许开发者使用Python等高级语言编写脚本,从而提高开发效率和代码可维护性。此外,SL4A还支持多种其他脚本语言,进一步扩展了其应用范围。通过这种方式,开发者可以快速构建功能丰富的移动应用,同时保持较高的灵活性和可扩展性。 ... [详细]
  • Android 图像色彩处理技术详解
    本文详细探讨了 Android 平台上的图像色彩处理技术,重点介绍了如何通过模仿美图秀秀的交互方式,利用 SeekBar 实现对图片颜色的精细调整。文章展示了具体的布局设计和代码实现,帮助开发者更好地理解和应用图像处理技术。 ... [详细]
  • 本文探讨了在Android应用中实现动态滚动文本显示控件的优化方法。通过详细分析焦点管理机制,特别是通过设置返回值为`true`来确保焦点不会被其他控件抢占,从而提升滚动文本的流畅性和用户体验。具体实现中,对`MarqueeText.java`进行了代码层面的优化,增强了控件的稳定性和兼容性。 ... [详细]
  • Flutter 2.* 路由管理详解
    本文详细介绍了 Flutter 2.* 中的路由管理机制,包括路由的基本概念、MaterialPageRoute 的使用、Navigator 的操作方法、路由传值、命名路由及其注册、路由钩子等。 ... [详细]
  • 开机自启动的几种方式
    0x01快速自启动目录快速启动目录自启动方式源于Windows中的一个目录,这个目录一般叫启动或者Startup。位于该目录下的PE文件会在开机后进行自启动 ... [详细]
  • 如何将TS文件转换为M3U8直播流:HLS与M3U8格式详解
    在视频传输领域,MP4虽然常见,但在直播场景中直接使用MP4格式存在诸多问题。例如,MP4文件的头部信息(如ftyp、moov)较大,导致初始加载时间较长,影响用户体验。相比之下,HLS(HTTP Live Streaming)协议及其M3U8格式更具优势。HLS通过将视频切分成多个小片段,并生成一个M3U8播放列表文件,实现低延迟和高稳定性。本文详细介绍了如何将TS文件转换为M3U8直播流,包括技术原理和具体操作步骤,帮助读者更好地理解和应用这一技术。 ... [详细]
  • Python 程序转换为 EXE 文件:详细解析 .py 脚本打包成独立可执行文件的方法与技巧
    在开发了几个简单的爬虫 Python 程序后,我决定将其封装成独立的可执行文件以便于分发和使用。为了实现这一目标,首先需要解决的是如何将 Python 脚本转换为 EXE 文件。在这个过程中,我选择了 Qt 作为 GUI 框架,因为之前对此并不熟悉,希望通过这个项目进一步学习和掌握 Qt 的基本用法。本文将详细介绍从 .py 脚本到 EXE 文件的整个过程,包括所需工具、具体步骤以及常见问题的解决方案。 ... [详细]
  • 本文探讨了Android系统中支持的图像格式及其在不同版本中的兼容性问题,重点涵盖了存储、HTTP传输、相机功能以及SparseArray的应用。文章详细分析了从Android 10 (API 29) 到Android 11 的存储规范变化,并讨论了这些变化对图像处理的影响。此外,还介绍了如何通过系统升级和代码优化来解决版本兼容性问题,以确保应用程序在不同Android版本中稳定运行。 ... [详细]
author-avatar
手机用户2602915241
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有