1、先上图
2、基本设计
2.1、根据MVC的设计原理,分组列表分三个部分来阐述;
2.1.1、控制器C,使Activity继承自ExpandableListActivity;
2.1.2、视图View,分组列表中视图主要分为两个部分,一个是表头部分,一个是表中单元格;创建两个XML文件分别描述;
2.2、数据模型Model,最简单的实现使用SimpleExpandableListAdapter构造方法构建一个简单适配器,初始化几个List提供一些简单的数据;
2.3、参照 Android开发基础控件ListView的使用
3、关键代码:
activity_main.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context="com.yusian.expandablelist.MainActivity"> <ExpandableListView android:id="@id/android:list" android:layout_width="match_parent" android:layout_height="match_parent"> </ExpandableListView> <TextView android:id="@id/android:empty" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="No Data"/> </LinearLayout> |
child.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:id="@+id/child_to" android:layout_width="match_parent" android:layout_height="44dp" android:gravity="center_vertical" android:paddingLeft="20dp" android:text="No data"/> </LinearLayout> |
group.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:id="@+id/group_to" android:layout_width="match_parent" android:layout_height="44dp" android:gravity="center_vertical" android:paddingLeft="30dp" android:text="No Data" android:background="#C0C0C0"/> </LinearLayout> |
MainActivity
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 53 54 55 56 57 58 59 60 61 62 63 64 65 66 | package com.yusian.expandablelist; import android.app.ExpandableListActivity; import android.os.Bundle; import android.widget.SimpleExpandableListAdapter; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class MainActivity extends ExpandableListActivity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 1、分组列表组头数据(所有组) // [{group:Group-1},{group:Group-2}] List<Map<String, String>> groups = new ArrayList<>(); Map<String, String> group1 = new HashMap<>(); group1.put("group", "Group-1"); Map<String, String> group2 = new HashMap<>(); group2.put("group", "Group-2"); groups.add(group1); groups.add(group2); // 2、分组列表,各种列表数据 // 2.1、第一组列表数据 // [{child:Child1-->Data1},{child:Child1-->Data2}] List<Map<String, String>> child1 = new ArrayList<>(); Map<String, String> child1Data1 = new HashMap<>(); child1Data1.put("child", "Child1-->Data1"); Map<String, String> child1Data2 = new HashMap<>(); child1Data2.put("child", "Child1-->Data2"); child1.add(child1Data1); child1.add(child1Data2); // 2.2、第二组列表数据 // [{child:Child2-->Data1},{child:Child2-->Data2}] List<Map<String, String>> child2 = new ArrayList<>(); Map<String, String> child2Data1 = new HashMap<>(); child2Data1.put("child", "Child2-->Data1"); Map<String, String> child2Data2 = new HashMap<>(); child2Data2.put("child", "Child2-->Data2"); child2.add(child2Data1); child2.add(child2Data2); // 2.3、将两列表数据添加到一个List中 /*[ [{child:Child1-->Data1},{child:Child1-->Data2}], [{child:Child2-->Data1},{child:Child2-->Data2}] ]**/ List<List<Map<String, String>>> childs = new ArrayList<>(); childs.add(child1); childs.add(child2); // 3、创建一个Adapter对象,通过构造方法初始化并赋值给当前ListView SimpleExpandableListAdapter adapter = new SimpleExpandableListAdapter(this, groups, R.layout.group, new String[]{"group"}, new int[]{R.id.group_to}, childs, R.layout.child, new String[]{"child"}, new int[]{R.id.child_to}); setListAdapter(adapter); } } |