it编程 > App开发 > Android

Android ExpandableListView用法示例详解

43人参与 2025-02-13 Android

引言

在 android 开发中,列表展示是一种非常常见的交互形式。而 expandablelistview 作为一种特殊的列表控件,它允许我们创建具有分组功能的列表,每个分组下还可以包含多个子项,并且分组可以展开和收缩,这大大增强了数据展示的灵活性和可读性。本文将详细介绍 expandablelistview 的用法,从基本概念到具体实现,再到高级应用,帮助你全面掌握这一控件。

1. expandablelistview 基本概念

expandablelistview 继承自 listview,是 android 提供的一种可展开的列表视图。它主要由分组(group)和子项(child)两部分组成。每个分组可以包含多个子项,用户可以通过点击分组来展开或收缩其对应的子项列表。这种控件适用于需要对数据进行分类展示的场景,例如联系人列表按照字母分组、商品列表按照类别分组等。

2. 布局文件中添加 expandablelistview

首先,我们需要在布局文件中添加 expandablelistview 控件。以下是一个简单的示例:

<!-- activity_main.xml -->
<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" />
</linearlayout>

在这个布局中,我们创建了一个垂直的线性布局,并在其中添加了一个 expandablelistview,其宽度和高度都设置为 match_parent,以填充整个父布局。

3. 创建数据模型

为了展示分组和子项的数据,我们需要创建相应的数据模型类。假设我们要展示一个水果分类列表,每个分类下有不同的水果,我们可以创建如下的数据模型类:

// groupmodel.java
public class groupmodel {
    private string groupname;
    public groupmodel(string groupname) {
        this.groupname = groupname;
    }
    public string getgroupname() {
        return groupname;
    }
    public void setgroupname(string groupname) {
        this.groupname = groupname;
    }
}
// childmodel.java
public class childmodel {
    private string childname;
    public childmodel(string childname) {
        this.childname = childname;
    }
    public string getchildname() {
        return childname;
    }
    public void setchildname(string childname) {
        this.childname = childname;
    }
}

groupmodel 类用于表示分组信息,包含一个分组名称;childmodel 类用于表示子项信息,包含一个子项名称。

4. 创建适配器

expandablelistview 需要使用适配器来将数据绑定到视图上。我们可以继承 baseexpandablelistadapter 类来创建自定义适配器。以下是一个示例:

import android.content.context;
import android.view.layoutinflater;
import android.view.view;
import android.view.viewgroup;
import android.widget.baseexpandablelistadapter;
import android.widget.textview;
import java.util.list;
public class myexpandablelistadapter extends baseexpandablelistadapter {
    private context context;
    private list<groupmodel> grouplist;
    private list<list<childmodel>> childlist;
    public myexpandablelistadapter(context context, list<groupmodel> grouplist, list<list<childmodel>> childlist) {
        this.context = context;
        this.grouplist = grouplist;
        this.childlist = childlist;
    }
    @override
    public int getgroupcount() {
        return grouplist.size();
    }
    @override
    public int getchildrencount(int groupposition) {
        return childlist.get(groupposition).size();
    }
    @override
    public object getgroup(int groupposition) {
        return grouplist.get(groupposition);
    }
    @override
    public object getchild(int groupposition, int childposition) {
        return childlist.get(groupposition).get(childposition);
    }
    @override
    public long getgroupid(int groupposition) {
        return groupposition;
    }
    @override
    public long getchildid(int groupposition, int childposition) {
        return childposition;
    }
    @override
    public boolean hasstableids() {
        return false;
    }
    @override
    public view getgroupview(int groupposition, boolean isexpanded, view convertview, viewgroup parent) {
        groupmodel groupmodel = (groupmodel) getgroup(groupposition);
        if (convertview == null) {
            layoutinflater inflater = (layoutinflater) context.getsystemservice(context.layout_inflater_service);
            convertview = inflater.inflate(android.r.layout.simple_expandable_list_item_1, null);
        }
        textview grouptextview = convertview.findviewbyid(android.r.id.text1);
        grouptextview.settext(groupmodel.getgroupname());
        return convertview;
    }
    @override
    public view getchildview(int groupposition, int childposition, boolean islastchild, view convertview, viewgroup parent) {
        childmodel childmodel = (childmodel) getchild(groupposition, childposition);
        if (convertview == null) {
            layoutinflater inflater = (layoutinflater) context.getsystemservice(context.layout_inflater_service);
            convertview = inflater.inflate(android.r.layout.simple_list_item_1, null);
        }
        textview childtextview = convertview.findviewbyid(android.r.id.text1);
        childtextview.settext(childmodel.getchildname());
        return convertview;
    }
    @override
    public boolean ischildselectable(int groupposition, int childposition) {
        return true;
    }
}

在这个适配器中,我们需要实现一系列的方法:

5. 在 activity 中使用 expandablelistview

在 activity 中,我们需要初始化数据、创建适配器并将其设置给 expandablelistview。以下是示例代码:

import android.os.bundle;
import android.widget.expandablelistview;
import androidx.appcompat.app.appcompatactivity;
import java.util.arraylist;
import java.util.list;
public class mainactivity extends appcompatactivity {
    private expandablelistview expandablelistview;
    private myexpandablelistadapter adapter;
    private list<groupmodel> grouplist;
    private list<list<childmodel>> childlist;
    @override
    protected void oncreate(bundle savedinstancestate) {
        super.oncreate(savedinstancestate);
        setcontentview(r.layout.activity_main);
        expandablelistview = findviewbyid(r.id.expandablelistview);
        // 初始化数据
        initdata();
        // 创建适配器
        adapter = new myexpandablelistadapter(this, grouplist, childlist);
        // 设置适配器
        expandablelistview.setadapter(adapter);
    }
    private void initdata() {
        grouplist = new arraylist<>();
        childlist = new arraylist<>();
        // 添加分组数据
        groupmodel group1 = new groupmodel("热带水果");
        groupmodel group2 = new groupmodel("温带水果");
        grouplist.add(group1);
        grouplist.add(group2);
        // 为每个分组添加子项数据
        list<childmodel> childlist1 = new arraylist<>();
        childlist1.add(new childmodel("香蕉"));
        childlist1.add(new childmodel("芒果"));
        childlist.add(childlist1);
        list<childmodel> childlist2 = new arraylist<>();
        childlist2.add(new childmodel("苹果"));
        childlist2.add(new childmodel("梨"));
        childlist.add(childlist2);
    }
}

在 oncreate 方法中,我们首先获取 expandablelistview 控件的引用,然后调用 initdata 方法初始化数据,接着创建适配器并将其设置给 expandablelistview。

6. 处理分组和子项的点击事件

我们可以为 expandablelistview 添加分组和子项的点击事件监听器,以实现相应的交互逻辑。以下是示例代码:

// 在 oncreate 方法中添加以下代码
expandablelistview.setongroupclicklistener(new expandablelistview.ongroupclicklistener() {
    @override
    public boolean ongroupclick(expandablelistview parent, view v, int groupposition, long id) {
        // 处理分组点击事件
        groupmodel groupmodel = (groupmodel) adapter.getgroup(groupposition);
        string groupname = groupmodel.getgroupname();
        // 这里可以添加自定义的逻辑,比如弹出提示框显示分组名称
        return false;
    }
});
expandablelistview.setonchildclicklistener(new expandablelistview.onchildclicklistener() {
    @override
    public boolean onchildclick(expandablelistview parent, view v, int groupposition, int childposition, long id) {
        // 处理子项点击事件
        childmodel childmodel = (childmodel) adapter.getchild(groupposition, childposition);
        string childname = childmodel.getchildname();
        // 这里可以添加自定义的逻辑,比如跳转到详情页面
        return false;
    }
});

在分组点击事件监听器中,我们可以获取点击的分组对象并进行相应的处理;在子项点击事件监听器中,我们可以获取点击的子项对象并进行相应的处理。

7. 高级应用:自定义视图

除了使用系统提供的简单布局,我们还可以自定义分组和子项的视图,以实现更丰富的界面效果。以下是一个自定义视图的示例:
自定义分组布局文件 group_item.xml

<linearlayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:padding="10dp">
    <imageview
        android:id="@+id/group_icon"
        android:layout_width="24dp"
        android:layout_height="24dp"
        android:src="@mipmap/ic_launcher" />
    <textview
        android:id="@+id/group_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginleft="10dp"
        android:textsize="18sp" />
</linearlayout>

自定义子项布局文件 child_item.xml

<linearlayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="horizontal"
    android:padding="10dp">
    <imageview
        android:id="@+id/child_icon"
        android:layout_width="24dp"
        android:layout_height="24dp"
        android:src="@mipmap/ic_launcher" />
    <textview
        android:id="@+id/child_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginleft="10dp"
        android:textsize="16sp" />
</linearlayout>

修改适配器中的 getgroupview 和 getchildview 方法

@override
public view getgroupview(int groupposition, boolean isexpanded, view convertview, viewgroup parent) {
    groupmodel groupmodel = (groupmodel) getgroup(groupposition);
    if (convertview == null) {
        layoutinflater inflater = (layoutinflater) context.getsystemservice(context.layout_inflater_service);
        convertview = inflater.inflate(r.layout.group_item, null);
    }
    imageview groupicon = convertview.findviewbyid(r.id.group_icon);
    textview grouptextview = convertview.findviewbyid(r.id.group_name);
    grouptextview.settext(groupmodel.getgroupname());
    return convertview;
}
@override
public view getchildview(int groupposition, int childposition, boolean islastchild, view convertview, viewgroup parent) {
    childmodel childmodel = (childmodel) getchild(groupposition, childposition);
    if (convertview == null) {
        layoutinflater inflater = (layoutinflater) context.getsystemservice(context.layout_inflater_service);
        convertview = inflater.inflate(r.layout.child_item, null);
    }
    imageview childicon = convertview.findviewbyid(r.id.child_icon);
    textview childtextview = convertview.findviewbyid(r.id.child_name);
    childtextview.settext(childmodel.getchildname());
    return convertview;
}

通过自定义视图,我们可以在分组和子项中添加更多的控件,如图片、按钮等,从而实现更复杂的界面效果。

8. 总结

expandablelistview 是 android 中一个非常实用的列表控件,它可以帮助我们实现具有分组功能的列表展示。通过本文的介绍,你应该已经掌握了 expandablelistview 的基本用法,包括布局文件的添加、数据模型的创建、适配器的实现、点击事件的处理以及自定义视图的应用。在实际开发中,你可以根据具体需求对其进行进一步的扩展和优化,以满足不同的业务场景。希望本文对你有所帮助,祝你在 android 开发中取得更好的成果!

(0)
打赏 微信扫一扫 微信扫一扫

您想发表意见!!点此发布评论

推荐阅读

Android 单例模式实现可复用数据存储的详细过程

02-13

Android项目中使用Eclipse导出jar文件的操作方法

02-13

Android kotlin语言实现删除文件的解决方案

02-13

四种Flutter子页面向父组件传递数据的方法介绍

02-13

Android使用WebView加载播放视频流及实现相关功能

02-13

Android实现图片裁剪处理的操作步骤

02-13

猜你喜欢

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论