使用ExpandableListView创建可扩展列表

简介: 使用ExpandableListView创建可扩展列表

一、什么是ExpandableListView?


ExpandableListView是Android提供的一个视图控件,用于展示可以展开和折叠的分组数据。它允许用户通过点击分组来展开或折叠子项,非常适合展示具有父子关系的数据结构,例如类别及其子项。


二、ExpandableListView的基本用法


使用ExpandableListView创建可扩展列表通常需要以下几个步骤:

  1. 准备数据:准备好父项和子项的数据源,通常使用适配器(Adapter)来管理数据与视图的关系。
  2. 创建适配器:实现ExpandableListAdapter接口或使用其子类,例如BaseExpandableListAdapter,自定义适配器来管理父项和子项的视图。
  3. 设置适配器:将自定义的适配器设置给ExpandableListView,让它能够正确显示和管理数据。
  4. 处理点击事件:根据需要处理父项和子项的点击事件,例如展开或折叠子项、处理子项点击等。


三、示例代码演示


下面我们通过一个简单的Android应用示例来演示如何使用ExpandableListView创建可扩展列表。


1. 布局文件


首先,创建一个XML布局文件activity_main.xml,包含一个ExpandableListView:

<!-- activity_main.xml -->
<?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">
    <ExpandableListView
        android:id="@+id/expandableListView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:divider="@android:color/darker_gray"
        android:dividerHeight="1dp"
        android:groupIndicator="@null" />
</LinearLayout>

在这个布局文件中,我们定义了一个ExpandableListView,设置了分割线颜色、高度以及去除了默认的展开折叠指示符。


2. Java代码


接下来,编写Java代码来实现ExpandableListView的功能。

package cn.juwatech.expandablelistviewexample;
import android.os.Bundle;
import android.widget.ExpandableListView;
import android.widget.Toast;
import androidx.appcompat.app.AppCompatActivity;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
public class MainActivity extends AppCompatActivity {
    ExpandableListView expandableListView;
    CustomExpandableListAdapter expandableListAdapter;
    List<String> listDataHeader;
    HashMap<String, List<String>> listDataChild;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // 准备数据
        prepareListData();
        // 获取ExpandableListView
        expandableListView = findViewById(R.id.expandableListView);
        // 创建适配器
        expandableListAdapter = new CustomExpandableListAdapter(this, listDataHeader, listDataChild);
        // 设置适配器
        expandableListView.setAdapter(expandableListAdapter);
        // 设置组点击事件监听器
        expandableListView.setOnGroupClickListener((parent, v, groupPosition, id) -> {
            Toast.makeText(getApplicationContext(), "Group Clicked: " + listDataHeader.get(groupPosition),
                    Toast.LENGTH_SHORT).show();
            return false;
        });
        // 设置子项点击事件监听器
        expandableListView.setOnChildClickListener((parent, v, groupPosition, childPosition, id) -> {
            Toast.makeText(getApplicationContext(),
                    "Child Clicked: " + listDataHeader.get(groupPosition) + " -> " + listDataChild.get(listDataHeader.get(groupPosition)).get(childPosition),
                    Toast.LENGTH_SHORT).show();
            return false;
        });
    }
    // 准备列表数据
    private void prepareListData() {
        listDataHeader = new ArrayList<>();
        listDataChild = new HashMap<>();
        // 添加父项数据
        listDataHeader.add("Fruits");
        listDataHeader.add("Animals");
        listDataHeader.add("Colors");
        // 添加子项数据
        List<String> fruits = new ArrayList<>();
        fruits.add("Apple");
        fruits.add("Orange");
        fruits.add("Banana");
        List<String> animals = new ArrayList<>();
        animals.add("Dog");
        animals.add("Cat");
        animals.add("Elephant");
        List<String> colors = new ArrayList<>();
        colors.add("Red");
        colors.add("Green");
        colors.add("Blue");
        // 放入父项和子项数据到HashMap
        listDataChild.put(listDataHeader.get(0), fruits);
        listDataChild.put(listDataHeader.get(1), animals);
        listDataChild.put(listDataHeader.get(2), colors);
    }
}

在这段代码中,我们做了以下几件事情:

  • 准备了父项和子项的数据源listDataHeaderlistDataChild
  • 创建了CustomExpandableListAdapter自定义适配器,继承自BaseExpandableListAdapter,用于管理和展示父项和子项的数据。
  • 将适配器设置给ExpandableListView,实现数据的展示。
  • 设置了组点击和子项点击的事件监听器,当点击父项或子项时显示相应的Toast消息。


四、总结


本文详细介绍了如何使用Android中的ExpandableListView创建可扩展列表。通过理解ExpandableListView的基本概念和使用方法,以及通过实例代码演示了如何准备数据、创建自定义适配器、设置适配器并处理点击事件。

相关文章
|
Android开发 开发者 存储
Android可折叠收缩伸展的Expandable分组RecyclerView:模型抽象和封装(二)
Android可折叠收缩伸展的Expandable分组RecyclerView:模型抽象和封装(二) 如今Android这种可收缩伸展的Expandable RecyclerView是如此常用,在附录1的基础上,我重新把模型进行了抽象和封装,设计了一套新的架构和简洁的使用方式支持这种功能。
3674 0
|
1天前
|
Java Android开发 UED
使用RecyclerView创建高效列表
使用RecyclerView创建高效列表
WPF项目中不支持 ResizingPanel,未在类型“ResizingPanel”中找到可附加的属性“ResizeWidth”
WPF项目中不支持 ResizingPanel,未在类型“ResizingPanel”中找到可附加的属性“ResizeWidth”
【Flutter】ListView 列表 ( List 集合的 map 方法说明 | 垂直列表 | 水平列表 | 代码示例 )
【Flutter】ListView 列表 ( List 集合的 map 方法说明 | 垂直列表 | 水平列表 | 代码示例 )
347 0
【Flutter】ListView 列表 ( List 集合的 map 方法说明 | 垂直列表 | 水平列表 | 代码示例 )
|
Java Android开发
【JetPack】为现有 Android 项目配置视图绑定 ( ViewBinding ) 模块 ( 视图绑定不影响传统布局操作 | 视图绑定类关联 Activity | 视图绑定类本质 )(一)
【JetPack】为现有 Android 项目配置视图绑定 ( ViewBinding ) 模块 ( 视图绑定不影响传统布局操作 | 视图绑定类关联 Activity | 视图绑定类本质 )(一)
193 0
【JetPack】为现有 Android 项目配置视图绑定 ( ViewBinding ) 模块 ( 视图绑定不影响传统布局操作 | 视图绑定类关联 Activity | 视图绑定类本质 )(一)
【JetPack】视图绑定 ( ViewBinding ) 各种应用 ( 视图绑定两种方式 | Activity 布局 | 对话框布局 | 自定义组件布局 | RecyclerView 列表布局 )
【JetPack】视图绑定 ( ViewBinding ) 各种应用 ( 视图绑定两种方式 | Activity 布局 | 对话框布局 | 自定义组件布局 | RecyclerView 列表布局 )
525 0
【JetPack】视图绑定 ( ViewBinding ) 各种应用 ( 视图绑定两种方式 | Activity 布局 | 对话框布局 | 自定义组件布局 | RecyclerView 列表布局 )
|
Android开发
【JetPack】为现有 Android 项目配置视图绑定 ( ViewBinding ) 模块 ( 视图绑定不影响传统布局操作 | 视图绑定类关联 Activity | 视图绑定类本质 )(二)
【JetPack】为现有 Android 项目配置视图绑定 ( ViewBinding ) 模块 ( 视图绑定不影响传统布局操作 | 视图绑定类关联 Activity | 视图绑定类本质 )(二)
169 0
|
虚拟化 C++ 缓存
UWP VirtualizedVariableSizedGridView 支持可虚拟化可变大小Item的View(二)
原文:UWP VirtualizedVariableSizedGridView 支持可虚拟化可变大小Item的View(二) 上篇UWP VirtualizedVariableSizedGridView 支持可虚拟化可变大小Item的View(一) 讲到该控件的需要和设计过程。
1026 0
|
虚拟化 索引
UWP VirtualizedVariableSizedGridView 支持可虚拟化可变大小Item的View(一)
原文:UWP VirtualizedVariableSizedGridView 支持可虚拟化可变大小Item的View(一) Boss的需要时这样的,Item是可变大小的,同时根据不同的Window size,来确定Item的结构和大小Window 小的时候是 大的时候是这样的: 当然这size变化的过程中也允许其他结构,我这里只是举了最大和最小时候的样子。
1107 0