Android : ExpandableListView(折叠列表) +BaseExpandableListAdapter-简单应用

news2024/9/23 21:23:10

示例图:

实体类DemoData.java

package com.example.myexpandablelistview.entity;

public class DemoData {
    private  String content;
    private int img;

    public DemoData(String content, int img) {
        this.content = content;
        this.img = img;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    public int getImg() {
        return img;
    }

    public void setImg(int img) {
        this.img = img;
    }
}

适配器 写个类继承 BaseExpandableListAdapter

package com.example.myexpandablelistview;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.ImageView;
import android.widget.TextView;

import com.example.myexpandablelistview.entity.DemoData;

import java.util.ArrayList;
import java.util.List;

// BaseAdapter 扩展
public class DemoExpandableListadpter extends BaseExpandableListAdapter {
    private List<String> groupDataList ;
    private List<ArrayList<DemoData>> itemDataList;
    private Context context;
    //优化
    static class HolderGroup{
        TextView titleTextView;
    }
    static class HolderChild{
        TextView contTextView;
        ImageView imageView;
    }
    public DemoExpandableListadpter(List<String> groupDataList, List<ArrayList<DemoData>> itemDataList, Context context) {
        this.groupDataList = groupDataList;
        this.itemDataList = itemDataList;
        this.context = context;
    }

    @Override
    public int getGroupCount() {
        //返回 外面组个数 3个
        return groupDataList.size();
    }

    @Override
    public int getChildrenCount(int groupPosition) {
        //groupPosition 外面组的下标 在获取里面子列表
        // 里面子列表个数
        return itemDataList.get(groupPosition).size();
    }

    @Override
    public Object getGroup(int groupPosition) {
        //返回组每一项对应的数据
        return groupDataList.get(groupPosition);
    }

    @Override
    public Object getChild(int groupPosition, int childPosition) {
        // 先获取对应的组下标,在获取子列表数据
        //返回子列表的每一项对应的数据
        return itemDataList.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) {
        //组布局View 外面的
        HolderGroup  holderGroup = null;
        if(holderGroup == null){
            holderGroup = new HolderGroup();
            //设置视图布局
            convertView = LayoutInflater.from(context).inflate(R.layout.group_view,parent,false);
            holderGroup.titleTextView = convertView.findViewById(R.id.btn_title);

            convertView.setTag(holderGroup);
        }else {
            holderGroup = (HolderGroup) convertView.getTag();
        }
        //设置值
        holderGroup.titleTextView.setText(groupDataList.get(groupPosition));
        return convertView;
    }

    @Override
    public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
        //里面的子布局
       HolderChild holderChild =null;
        if(holderChild == null){
            holderChild = new HolderChild();

            //设置视图布局
            convertView = LayoutInflater.from(context).inflate(R.layout.child_view,parent,false);
            holderChild.imageView = convertView.findViewById(R.id.btn_img);
            holderChild.contTextView = convertView.findViewById(R.id.btn_cont);

            convertView.setTag(holderChild);
        }else {
            holderChild = (HolderChild)convertView.getTag();
        }
        //设置值
        holderChild.imageView.setBackgroundResource(itemDataList.get(groupPosition).get(childPosition).getImg());
        holderChild.contTextView.setText(itemDataList.get(groupPosition).get(childPosition).getContent());
        return convertView;
    }

    //设置子列是否可以选中 true  false
    @Override
    public boolean isChildSelectable(int groupPosition, int childPosition) {
        //false 点击事件无效
        return true;
    }
}

MainAcitvity.java

package com.example.myexpandablelistview;

import androidx.appcompat.app.AppCompatActivity;

import android.content.Context;
import android.os.Bundle;
import android.view.View;
import android.widget.ExpandableListView;
import android.widget.Toast;

import com.example.myexpandablelistview.entity.DemoData;

import java.util.ArrayList;
import java.util.List;

public class MainActivity extends AppCompatActivity {
    //定义组件
    private ExpandableListView expandableListView;
    private Context context;

    private List<String> groupDataList = null;
    private List<ArrayList<DemoData>> itemDataList = null;
    private ArrayList<DemoData> itemData =null;


    //定义图片资源图片
    private int[] arr = {
            R.mipmap.e,
            R.mipmap.f,
            R.mipmap.g,
            R.mipmap.h,
            R.mipmap.i,

    };
    private int[] arr2 = {
            R.mipmap.g,
            R.mipmap.h,
            R.mipmap.i,

    };
    /*实现ExpandableAdapter的三种方式
    1.扩展BaseExpandableListAdpter实现ExpandableAdapter。
    2.使用SimpleExpandableListAdpater将两个List集合包装成ExpandableAdapter
    3.使用simpleCursorTreeAdapter将Cursor中的数据包装成SimpleCuroTreeAdapter
    使用的是第一个,扩展BaseExpandableListAdpter,我们需要重写该类中的相关方法*/
    private DemoExpandableListadpter demoExpandableListadpter = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //传入上下文
        context = this;

        expandableListView = findViewById(R.id.expandable_list_view);
        //添加数据
        itemDataList = new ArrayList<ArrayList<DemoData>>();

        groupDataList = new ArrayList<>();
        for(int i = 0;i < 3; i++){
            groupDataList.add("我是标题"+i);
        }

        //内容 和图片 1 循环添加出错 java.lang.IndexOutOfBoundsException
        itemData = new ArrayList<DemoData>();
        for (int i =0 ; i< arr.length; i++){
            itemData.add(new DemoData("我是文字"+i,arr[i]));
        }
        itemDataList.add(itemData);

        //内容 和图片 2
        itemData = new ArrayList<DemoData>();
        for (int i =0 ; i< arr2.length; i++){
            itemData.add(new DemoData("我是文字"+i,arr2[i]));
        }

        itemDataList.add(itemData);

        //内容 和图片 3
        itemData = new ArrayList<DemoData>();
        for (int i =0 ; i< arr.length; i++){
            itemData.add(new DemoData("我是文字"+i,arr[i]));
        }

        itemDataList.add(itemData);

        //把数据传入
        demoExpandableListadpter = new DemoExpandableListadpter(groupDataList,itemDataList,context);


        //往视图容器中添加 适配器
        expandableListView.setAdapter(demoExpandableListadpter);

        //列表设置点击事件
        expandableListView.setOnChildClickListener(new ExpandableListView.OnChildClickListener() {
            @Override
            public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition, long id) {
                Toast.makeText(context,"您选择了"+itemDataList.get(groupPosition).get(childPosition).getContent(),Toast.LENGTH_SHORT).show();
                return false;
            }
        });

    }
}

主布局:activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <ExpandableListView
        android:id="@+id/expandable_list_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"

        />

</LinearLayout>

组布局 group_view.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:orientation="vertical"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/btn_title"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="30sp"
        android:textStyle="bold"
        android:paddingLeft="50dp"
        android:text="123"
        />
</LinearLayout>

子布局 child_view.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">

    <ImageView
        android:id="@+id/btn_img"
        android:layout_width="60dp"
        android:layout_height="60dp"

        />

    <TextView
        android:textSize="24sp"
        android:id="@+id/btn_cont"
        android:layout_width="match_parent"
        android:layout_height="60dp"
        android:gravity="center_vertical"
        android:text="1234"
        />

</LinearLayout>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1244321.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

1999-2021年地级市城镇居民人均消费性支出数据

1999-2021年地级市城镇居民人均消费性支出数据 1、时间&#xff1a;1999-2021年 2、指标&#xff1a;城镇居民人均消费性支出 3、范围&#xff1a;290个地级市 4、来源&#xff1a;城市年鉴、地级市统计公报 5、指标解释&#xff1a; 城镇居民人均消费性支出&#xff1a;指…

SpringBoot 导入其他配置文件

默认情况下&#xff0c;springboot 初始的项目中都有一个 application.yml 或者 application.properties 文件&#xff0c;如果我们希望再定义一个独立的配置文件用来配置特定业务数据&#xff0c;而不希望把这些配置内容都堆积在 application 配置文件中&#xff0c;实现这个需…

微电子专业词汇汇总,芯片人必备!

在芯片行业&#xff0c;很多相关的技术术语都是用英文表述。在这里为大家整理了一些常用的微电子专业词汇&#xff0c;希望对大家有所帮助。&#xff08;文末可领全部文档&#xff09; Abrupt junction 突变结 Accelerated testing 加速实验 Acceptor 受主 Acceptor atom 受主…

PS 注释工具 基础使用方法讲解

好 上文PS 颜色取样器&标尺工具 基本使用讲解中 我们讲了 颜色取样器和标尺工具的基本用法 下面我们来看一下 注释工具 这个 主要是后面 比较大的作品 可能不是我们一个人取设计 团队作图 就需要用到它 选择 注释工具 后 我们随便点击图像任何一个位置 右侧就会出现一个输…

Python 如何开发出RESTful Web接口,DRF框架助力灵活实现!

Django Rest Framework&#xff08;DRF&#xff09;是构建强大且灵活的Web API的优秀工具。它基于Django&#xff0c;提供了一套用于构建Web API的组件和工具&#xff0c;简化了API开发过程&#xff0c;同时保留了Django的优雅和强大。 一、Web应用模式 在开发Web应用时&…

边海防可视化智能视频监控与AI监管方案,助力边海防线建设

一、背景与需求 我国有3万多公里的边境线和海岸线&#xff0c;随着我国边海防基础设施建设的快速发展&#xff0c;边海安防也逐渐走向智能化。传统人工巡防的方式已经无法满足边海智能化监管的需求&#xff0c;在沿海、沿边地区进行边海智慧安防视频监控系统等边海防基础设施建…

深度学习卷积神经网络的花卉识别 计算机竞赛

文章目录 0 前言1 项目背景2 花卉识别的基本原理3 算法实现3.1 预处理3.2 特征提取和选择3.3 分类器设计和决策3.4 卷积神经网络基本原理 4 算法实现4.1 花卉图像数据4.2 模块组成 5 项目执行结果6 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 基…

手写promise(3)-- 实例方法 静态方法

目录 实例方法 catch finally 静态方法 reslove reject race all allSettled any 实例方法 提供给promise实例的方法 包括catch 与finally catch Promise 实例的 catch() 方法用于注册一个在 promise 被拒绝时调用的函数。它会立即返回一个等效的 Promise 对象&…

jjwt使用说明-笔记

jjwt官网链接&#xff1a;https://github.com/jwtk/jjwt POM 依赖 <dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-api</artifactId><version>0.12.3</version> </dependency> <dependency><grou…

会议动态 | 祝贺2023 中国商品混凝土年会在上海隆重召开!

2023年11月19日-21日&#xff0c;由&#xff08;国家&#xff09;建筑材料工业技术情报研究所、中国散装水泥推广发展协会混凝土专委会主办的"笃信固本 行稳致远"——2023 第十九届全国商品混凝土可持续发展论坛暨2023中国商品混凝土年会在上海隆重召开&#xff01; …

什么是指针碰撞

程序员的公众号&#xff1a;源1024&#xff0c;获取更多资料&#xff0c;无加密无套路&#xff01; 最近整理了一波电子书籍资料&#xff0c;包含《Effective Java中文版 第2版》《深入JAVA虚拟机》&#xff0c;《重构改善既有代码设计》&#xff0c;《MySQL高性能-第3版》&…

Shell 通配符与正则表达元字符

Author&#xff1a;rab 目录 前言一、通配符1.1 *1.2 ?1.3 []1.4 {} 二、正则表达元字符2.1 *2.2 .2.3 ^2.4 $2.5 []2.6 \2.7 \<\>2.8 \{\} 总结 前言 不管是学任何语言&#xff0c;几乎都会涉及到通配符与正则的使用。有时候对于 Linux 初学者来说&#xff0c;往往会将…

线上问题排查实例分析|关于 Redis 内存泄漏

Redis 作为高性能的 key-value 内存型数据库&#xff0c;普遍使用在对性能要求较高的系统中&#xff0c;同时也是滴滴内部的内存使用大户。本文从 KV 团队对线上 Redis 内存泄漏定位的时间线维度&#xff0c;简要介绍 Linux 上内存泄漏的问题定位思路和工具。 16:30 问题暴露 业…

gitt开源项目的意义,公司为什么会对在gitt上有开源项目的人更大机会

Git是一种分布式版本控制系统&#xff0c;它可以帮助程序员管理代码的历史版本和协同工作。同时&#xff0c;Git也成为了开源项目的主要托管平台之一。Git的开源项目意义重大&#xff0c;因为这种开源项目托管平台可以帮助开发者将代码和项目分享给全球的开发者&#xff0c;并且…

linux网络之网络层与数据链路层

文章目录 一、网络层 1.IP协议 2.IP协议头格式 3.网段划分 4.特殊ip地址 5.IP地址的数量限制 6.私有ip和公网IP 7.路由 二、数据链路层 1.以太网 2.以太网帧格式 3.MAC地址 4.对比理解MAC地址和IP地址 5.MTU 6.ARP协议 ARP协议的工作流程 ARP数据报的格式 7.DNS 8.ICMP协议 9.N…

从六个方面对比Go和Python的差异

您是否想过 Go 与 Python 之间的主要区别是什么&#xff1f;随着对软件开发人员的需求不断增加&#xff0c;选择哪种编码语言可能会很困难。 ​ 在此&#xff0c;我们将从六个方面对比Go和Python,探讨 Go 和 Python之间的差异。我们将讨论它们的特点、优缺点&#xff0c;以便…

mongodb数据库的常用操作语句

说在前面的话 本文所有的操作示例&#xff0c;都以集合“HistoryTaskBase”为例。 一、查询 1、时间区间 查询“通知时间”介于2019-09-01到2019-10-01之间的数据。 db.getCollection(HistoryTaskBase).find({notifyTime:{$gte:ISODate(2019-09-01T00:00:00.000Z),$lte:ISOD…

Nginx:简介、安装与部署

一、Nginx简介 Nginx是一个很好的高性能Web和反向大力服务器&#xff0c;它具有很多非常优越的特性&#xff1a;在高连接并发的情况下&#xff0c;Nginx是Apahe服务器的不错的替代品&#xff1a;Nginx在美国是虚拟主机生意选择的软件平台之一。能够支持50000个并发连接数的响应…

《洛谷深入浅出基础篇》P4017最大食物链————拓扑排序

上链接&#xff1a;P4017 最大食物链计数 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)https://www.luogu.com.cn/problem/P4017 上题干&#xff1a; 题目背景 你知道食物链吗&#xff1f;Delia 生物考试的时候&#xff0c;数食物链条数的题目全都错了&#xff0c;因为她总是…

高质量短效SOCKS5代理IP是什么意思?作为技术你了解吗

小张是一位网络安全技术测试员&#xff0c;最近他接到了一个头疼的任务&#xff0c;那就是评估公司系统的安全性&#xff0c;因此他前来咨询&#xff0c;在得知SOCKS5代理IP可以帮他之后&#xff0c;他不禁产生疑问&#xff0c;这是什么原理&#xff1f;其实和小张一样的朋友不…