Android数据适配-ExpandableListView

简介:

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,如需转载请自行联系原作者

相关文章
|
3月前
|
开发工具 Android开发 开发者
Android平台如何不推RTMP|不发布RTSP流|不实时录像|不回传GB28181数据时实时快照?
本文介绍了一种在Android平台上实现实时截图快照的方法,尤其适用于无需依赖系统接口的情况,如在RTMP推送、RTSP服务或GB28181设备接入等场景下进行截图。通过底层模块(libSmartPublisher.so)实现了截图功能,封装了`SnapShotImpl.java`类来管理截图流程。此外,提供了关键代码片段展示初始化SDK实例、执行截图、以及在Activity销毁时释放资源的过程。此方案还考虑到了快照数据的灵活处理需求,符合GB/T28181-2022的技术规范。对于寻求更灵活快照机制的开发者来说,这是一个值得参考的设计思路。
|
5月前
|
XML 存储 JSON
51. 【Android教程】JSON 数据解析
51. 【Android教程】JSON 数据解析
146 2
|
6月前
|
数据库 Android开发
Android 通过升级SettingsProvider数据强制覆盖用户的设置项
Android 通过升级SettingsProvider数据强制覆盖用户的设置项 【5月更文挑战第7天】
154 5
|
26天前
|
存储 大数据 数据库
Android经典面试题之Intent传递数据大小为什么限制是1M?
在 Android 中,使用 Intent 传递数据时存在约 1MB 的大小限制,这是由于 Binder 机制的事务缓冲区限制、Intent 的设计初衷以及内存消耗和性能问题所致。推荐使用文件存储、SharedPreferences、数据库存储或 ContentProvider 等方式传递大数据。
41 0
|
2月前
|
调度 Android开发 UED
Android经典实战之Android 14前台服务适配
本文介绍了在Android 14中适配前台服务的关键步骤与最佳实践,包括指定服务类型、请求权限、优化用户体验及使用WorkManager等。通过遵循这些指南,确保应用在新系统上顺畅运行并提升用户体验。
173 6
|
3月前
|
JSON Java Android开发
Android 开发者必备秘籍:轻松攻克 JSON 格式数据解析难题,让你的应用更出色!
【8月更文挑战第18天】在Android开发中,解析JSON数据至关重要。JSON以其简洁和易读成为首选的数据交换格式。开发者可通过多种途径解析JSON,如使用内置的`JSONObject`和`JSONArray`类直接操作数据,或借助Google提供的Gson库将JSON自动映射为Java对象。无论哪种方法,正确解析JSON都是实现高效应用的关键,能帮助开发者处理网络请求返回的数据,并将其展示给用户,从而提升应用的功能性和用户体验。
81 1
|
3月前
|
缓存 API Android开发
Android经典实战之Kotlin Flow中的3个数据相关的操作符:debounce、buffer和conflate
本文介绍了Kotlin中`Flow`的`debounce`、`buffer`及`conflate`三个操作符。`debounce`过滤快速连续数据,仅保留指定时间内的最后一个;`buffer`引入缓存减轻背压;`conflate`仅保留最新数据。通过示例展示了如何在搜索输入和数据流处理中应用这些操作符以提高程序效率和用户体验。
49 6
|
3月前
|
编解码 网络协议 前端开发
如何实现Android平台GB28181设备接入模块按需打开摄像头并回传数据
后台采集摄像头,如果想再进一步扩展,可以把android平台gb28181的camera2 demo,都移植过来,实现功能更强大的国标设备侧,这里主要是展示,收到国标平台侧的回传请求后,才打开摄像头,才开始编码打包,最大限度的减少资源的占用
|
3月前
|
编解码 网络协议 Android开发
Android平台GB28181设备接入模块实现后台service按需回传摄像头数据到国标平台侧
我们在做Android平台GB28181设备对接模块的时候,遇到这样的技术需求,开发者希望能以后台服务的形式运行程序,国标平台侧没有视频回传请求的时候,仅保持信令链接,有发起视频回传请求或语音广播时,打开摄像头,并实时回传音视频数据或接收处理国标平台侧发过来的语音广播数据。
|
3月前
|
算法 数据处理 开发工具
Android平台RTSP|RTMP播放器如何回调YUV或RGB数据
在开发Android平台上的RTSP或RTMP播放器时,开发者不仅追求低延迟播放,还希望获取解码后的视频数据(如YUV或RGB格式),以便进行视觉算法分析。使用大牛直播SDK中的SmartPlayer,可在确保播放流畅的同时,通过设置外部渲染器(`SmartPlayerSetExternalRender`)来高效地回调原始视频数据。例如,对于RGBA数据,需实现`NTExternalRender`接口,并重写相关方法以处理数据和尺寸变化。同样地,对于I420(YUV)数据,也需要相应地实现接口以满足需求。这种方式使得开发者能在不影响常规播放功能的情况下,进行定制化的视频处理任务。