Android开发之ExpandableListView(分组列表)的简单使用

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);
    }
}

Leave a Reply