Android中ListView的用法基本上学的时候都会使用,其中可以使用ArrayAdapter,SimpleAdapter,BaseAdapter去实现,这次主要使用的ExpandableListView展示一种两层的效果,ExpandableListView是android中可以实现下拉list的一个控件类似于QQ那种我好友之后就是一排自己的好友,就是两层效果,实现的话使用SimpleExpandableListAdapter即可。

布局文件

先看下效果:

main中xml代码:

1
2
3
4
5
6
7
8
9
10
11
<Button
      android:onClick="test"
      android:layout_width="fill_parent"
      android:layout_height="wrap_content"
      android:text="FlyElephant" />
  <ExpandableListView
      android:id="@id/android:list"
      android:layout_width="fill_parent"
      android:layout_height="fill_parent"
      android:drawSelectorOnTop="false" />

定义一个省份的province.xml:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
    <TextView
        android:id="@+id/list_provinceText"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:paddingBottom="8px"
        android:paddingLeft="30px"
        android:paddingRight="5px"
        android:paddingTop="8px"
        android:textSize="20sp" />
</LinearLayout>

定义了一个地区的child.xml:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >
     
       <TextView
        android:id="@+id/child_text"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:paddingBottom="8px"
        android:paddingLeft="30px"
        android:paddingRight="5px"
        android:paddingTop="8px"
        android:textSize="20sp" />
     
</LinearLayout>

Demo实现

主要实现代码,代码中都已经注释,其中最主要的SimpleExpandableListAdapter中的参数,这个参数太多,很容易弄错,可以看下注释或者API文档:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
// 创建一级条目
 List<Map<String, String>> provinces = new ArrayList<Map<String, String>>();
 //创建两个省份一级条目
 Map<String, String> firstProvince= new HashMap<String, String>();
 firstProvince.put("province""河南");
 Map<String, String> secondProvince= new HashMap<String, String>();
 secondProvince.put("province""北京");
 provinces.add(firstProvince);
 provinces.add(secondProvince);
 // 创建一级条目下的的二级地区条目
 List<Map<String, String>> childList1= new ArrayList<Map<String, String>>();
 //同样是在一级条目目录下创建两个对应的二级条目目录
 Map<String, String> child1= new HashMap<String, String>();
 child1.put("child""郑州");
 Map<String, String> child2 = new HashMap<String, String>();
 child2.put("child""开封");
 childList1.add(child1);
 childList1.add(child2);
 //同上
 List<Map<String, String>> childList2 = new ArrayList<Map<String, String>>();
 Map<String, String> child3 = new HashMap<String, String>();
 child3.put("child""海淀");
 Map<String, String> child4 = new HashMap<String, String>();
 child4.put("child""昌平");
 childList2.add(child3);
 childList2.add(child4);
 // 将二级条目放在一个集合里,供显示时使用
 List<List<Map<String, String>>> childs = new ArrayList<List<Map<String, String>>>();
 childs.add(childList1);
 childs.add(childList2);
 /**
  * 使用SimpleExpandableListAdapter显示ExpandableListView
  * 参数1.上下文对象Context
  * 参数2.一级条目目录集合
  * 参数3.一级条目对应的布局文件
  * 参数4.fromto,就是map中的key,指定要显示的对象
  * 参数5.与参数4对应,指定要显示在groups中的id
  * 参数6.二级条目目录集合
  * 参数7.二级条目对应的布局文件
  * 参数8.fromto,就是map中的key,指定要显示的对象
  * 参数9.与参数8对应,指定要显示在childs中的id
  */
 SimpleExpandableListAdapter adapter = new SimpleExpandableListAdapter(
         this, provinces, R.layout.list_group, new String[] { "province" },
         new int[] { R.id.list_groupText }, childs, R.layout.child,
         new String[] { "child" }, new int[] { R.id.child_text });
 setListAdapter(adapter);

这个mainActivity需要继承ExpandableListActivity,当然你可以设置其中的点击事件,只要重写一下方法即可:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
/**
 * 设置哪个二级目录被默认选中
 */
@Override
public boolean setSelectedChild(int groupPosition, int childPosition,
        boolean shouldExpandGroup) {
        //do something
    return super.setSelectedChild(groupPosition, childPosition,
            shouldExpandGroup);
}
/**
 * 设置哪个一级目录被默认选中
 */
@Override
public void setSelectedGroup(int groupPosition) {
    //do something
    super.setSelectedGroup(groupPosition);
}
/**
 * 当二级条目被点击时响应
 */
@Override
public boolean onChildClick(ExpandableListView parent, View v,
        int groupPosition, int childPosition, long id) {
        //do something
    return super.onChildClick(parent, v, groupPosition, childPosition, id);
}

效果如下:

上面这个例子写的有点单调,其实第二个你子的布局直接是空的也行,例如定义一个images.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:orientation="horizontal" >
    <ImageView
        android:src="@drawable/open"
        android:layout_width="20dp"
        android:layout_height="20dp" />
    <TextView
        android:id="@+id/txtName"
       android:paddingLeft="10dp"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />
</LinearLayout>

然后定义一个items.xml

1
2
3
4
5
6
7
8
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/items"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" >
     
</TextView>

 代码调用:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
public class MyExpandleActivity extends Activity {
    /**
     * 实现可扩展展开列ExpandableListView的三种方式
     * 一是使用SimpleExpandableListAdpater将两个List集合包装成ExpandableListView 二是
     * 扩展BaseExpandableListAdpter
     * 三是使用simpleCursorTreeAdapter将Cursor中的数据包装成SimpleCuroTreeAdapter
     */
    private String[] names = { "腾讯""百度""阿里巴巴" };
    private String[][] childnames = { { "马化腾""张小龙","社交"},
            "李彦宏""马东敏","搜索" }, { "马云""陆兆禧","电商" } };
    private ExpandableListView ep;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_my_expandle);
        // 定义父列表项List数据集合
        List<Map<String, String>> group = new ArrayList<Map<String, String>>();
        // 定义子列表项List数据集合
        List<List<Map<String, String>>> ss = new ArrayList<List<Map<String, String>>>();
        for (int i = 0; i < names.length; i++) {
            // 提供父列表的数据
            Map<String, String> maps = new HashMap<String, String>();
            maps.put("names", names[i]);
            group.add(maps);
            // 提供当前父列的子列数据
            List<Map<String, String>> child = new ArrayList<Map<String, String>>();
            for (int j = 0; j < names.length; j++) {
                Map<String, String> mapsj = new HashMap<String, String>();
                mapsj.put("map", childnames[i][j]);
                child.add(mapsj);
            }
            ss.add(child);
        }
        /**
         * 第一个参数 应用程序接口 this 第二个父列List<?extends Map<String,Object>>集合 为父列提供数据
         * 第三个参数 父列显示的组件资源文件 第四个参数 键值列表 父列Map字典的key 第五个要显示的父列组件id 第六个 子列的显示资源文件
         * 第七个参数 键值列表的子列Map字典的key 第八个要显示子列的组件id
         */
        SimpleExpandableListAdapter expand = new SimpleExpandableListAdapter(
                this, group, R.layout.images, new String[] { "names" },
                new int[] { R.id.txtName }, ss, R.layout.items,
                new String[] { "map" }, new int[] { R.id.items });
        ep = (ExpandableListView) findViewById(R.id.expanable_mylist);
        ep.setAdapter(expand);
    }
}

  效果跟上面相同:

本文转自Fly_Elephant博客园博客,原文链接:http://www.cnblogs.com/xiaofeixiang/p/4107356.html,如需转载请自行联系原作者

Android数据适配-ExpandableListView相关推荐

  1. android 中使用ExpandableListView控件结合服务器json文件的下载

    布局文件代码: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"xmlns ...

  2. Android屏幕适配全攻略(最权威的官方适配指导)(转),共大家分享。

    Android的屏幕适配一直以来都在折磨着我们这些开发者,本篇文章以Google的官方文档为基础,全面而深入的讲解了Android屏幕适配的原因.重要概念.解决方案及最佳实践,我相信如果你能认真的学习 ...

  3. android q测试机型,小米9安卓Q系统刷机包开启测试 小米Android Q适配机型一览

    7月9日,小米9 Android Q Beta版已开启测试.MIUI官方微博宣布,小米9 Android Q Beta版已开启测试,正在招募尝鲜用户.看名字就可以看出,新系统是基于Android Q打 ...

  4. Android屏幕适配全攻略(最权威的官方适配指导) (转)

    招聘信息: Cocos2d-X 前端主程 [新浪微博]手机客户端iOS研发工程师 20k-40k iOS 开发工程师 iOS高级开发工程师(中国排名第一的企业级移动互联网云计算公司 和创科技 红圈营销 ...

  5. 【收藏】Android屏幕适配全攻略(最权威的Google官方适配指导)

    来源:http://blog.csdn.net/zhaokaiqiang1992 更多:Android AutoLayout全新的适配方式, 堪称适配终结者 Android的屏幕适配一直以来都在折磨着 ...

  6. 【转】android多分辨率适配

    前一阶段开发android项目,由于客户要求进行多分辨率适配,能够支持国内主流的分辨率手机.因此经过了几次开发走了很多弯路,目前刚刚领略了android多分辨率适配的一些方法. 先介绍一下所走的弯路, ...

  7. Android P 适配指南

    Android P 适配指南 原创: 王超 刘望舒 1周前 作者:王超1478507995000 https://juejin.im/post/5b8959f96fb9a019fe685eb3 本文由 ...

  8. Android屏幕适配全方位解析与指导

    Android的屏幕适配一直以来都在折磨着我们这些开发者,本篇文章以Google的官方文档为基础,全面而深入的讲解了Android屏幕适配的原因.重要概念.解决方案及最佳实践,我相信如果你能认真的学习 ...

  9. Android图像适配

    转载自:http://blog.csdn.net/zhaokaiqiang1992 Android的屏幕适配一直以来都在折磨着我们这些开发者,本篇文章以Google的官方文档为基础,全面而深入的讲解了 ...

最新文章

  1. 特斯拉撞了警车:Autopilot全程开启,连撞两车还没自动停下
  2. mysql判断视图是否存在_使用JDBC查询是否存在某表或视图,按月动态生成表
  3. Ognl标签常用例子 只能在Struts2中使用
  4. mysql id 字段类型转换_mysql 数据类型转换
  5. input表单只允许输入大于0的整数
  6. 手机号码归属地及运营商查询
  7. python会不会出4_无极4网人生苦短,Python会不会被取代?国外网友
  8. python爬虫lxml xpath测试
  9. PL/SQL developer快速执行选定语句
  10. ESP32 TIMER
  11. Python 面向对象 —— 多重继承
  12. MongoDB整理笔记のGUI操作
  13. 对称加密算法和非对称加密算法速度对比
  14. 谈谈如何提升工作效率,需要从这4方面入手!
  15. 7-5 3824经典游戏分数 20 作者 李佳单位 重庆大学
  16. 80后男人的脱单技巧
  17. RAID 磁盘阵列与阵列卡
  18. Unity读取数据库的简单思路
  19. 基于python高校学生管理系统
  20. 软件测试/测试开发丨Java or Python?测试开发工程师如何选择合适的编程语言?

热门文章

  1. 已知一个掺杂了多个数字字符的中文名拼音,去掉所有数字字符之后,形式为“名”+空格+“姓”;并且名和姓的首字母大写,其他小写,要求输出姓名全拼,且全为小写。(后附详细样例说明)
  2. 方法:求两个数之和 判断两数是否相等
  3. LeetCode【13--罗马数字转整数】LeetCode【14--最长的公共前缀】
  4. C++转换构造函数和类型转换函数
  5. c,c++中字符串处理函数strtok,strstr,strchr,strsub
  6. 【计算机系统设计】实践笔记(2)数据通路构建:第一类R型指令分析(2)
  7. Leetcode | 107. Binary Tree Level Order Traversal II
  8. 阿里P8亲自讲解!java中级开发工程师需要掌握的技能
  9. Struts2学习笔记(一)--入门常见配置
  10. Python Email发送,通知业务完成