ExpandableListView实现二层和三层列表源码

2024-06-04 10:08

本文主要是介绍ExpandableListView实现二层和三层列表源码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

二层列表是直接用androidAPI中的ExpandableListView即可实现,三层列表其实是对二层列表的一个嵌套,实现起来会相对繁琐。

部分代码:

SuperTreeViewAdapter.java

复制代码
public class SuperTreeViewAdapter extends BaseExpandableListAdapter {static public class SuperTreeNode {Object parent;//二级树形菜单的结构体List<TreeViewAdapter.TreeNode> childs = new ArrayList<TreeViewAdapter.TreeNode>();}private List<SuperTreeNode> superTreeNodes = new ArrayList<SuperTreeNode>();private Context parentContext;private OnChildClickListener stvClickEvent;//外部回调函数public SuperTreeViewAdapter(Context view,OnChildClickListener stvClickEvent) {parentContext = view;this.stvClickEvent=stvClickEvent;}public List<SuperTreeNode> GetTreeNode() {return superTreeNodes;}public void UpdateTreeNode(List<SuperTreeNode> node) {superTreeNodes = node;}public void RemoveAll(){superTreeNodes.clear();}public Object getChild(int groupPosition, int childPosition) {return superTreeNodes.get(groupPosition).childs.get(childPosition);}public int getChildrenCount(int groupPosition) {return superTreeNodes.get(groupPosition).childs.size();}public ExpandableListView getExpandableListView() {AbsListView.LayoutParams lp = new AbsListView.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT, TreeViewAdapter.ItemHeight);ExpandableListView superTreeView = new ExpandableListView(parentContext);superTreeView.setLayoutParams(lp);return superTreeView;}/*** 三层树结构中的第二层是一个ExpandableListView*/    public View getChildView(int groupPosition, int childPosition,boolean isLastChild, View convertView, ViewGroup parent) {//final ExpandableListView treeView = getExpandableListView();final TreeViewAdapter treeViewAdapter = new TreeViewAdapter(this.parentContext,0);List<TreeNode> tmp = treeViewAdapter.getTreeNode();//临时变量取得TreeViewAdapter的TreeNode集合,可为空final TreeNode treeNode=(TreeNode) getChild(groupPosition, childPosition);tmp.add(treeNode);treeViewAdapter.updateTreeNode(tmp);treeView.setAdapter(treeViewAdapter);//关键点:取得选中的二级树形菜单的父子节点,结果返回给外部回调函数treeView.setOnChildClickListener(this.stvClickEvent);/*** 关键点:第二级菜单展开时通过取得节点数来设置第三级菜单的大小*/treeView.setOnGroupExpandListener(new OnGroupExpandListener() {@Overridepublic void onGroupExpand(int groupPosition) {AbsListView.LayoutParams lp = new AbsListView.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,(treeNode.childs.size()+1)*TreeViewAdapter.ItemHeight + 10);treeView.setLayoutParams(lp);}});/*** 第二级菜单回收时设置为标准Item大小*/treeView.setOnGroupCollapseListener(new OnGroupCollapseListener() {@Overridepublic void onGroupCollapse(int groupPosition) {AbsListView.LayoutParams lp = new AbsListView.LayoutParams(ViewGroup.LayoutParams.FILL_PARENT,TreeViewAdapter.ItemHeight);treeView.setLayoutParams(lp);}});treeView.setPadding(TreeViewAdapter.PaddingLeft*2, 0, 0, 0);return treeView;}/*** 三级树结构中的首层是TextView,用于作为title*/public View getGroupView(int groupPosition, boolean isExpanded,View convertView, ViewGroup parent) {TextView textView = TreeViewAdapter.getTextView(this.parentContext);textView.setText(getGroup(groupPosition).toString());textView.setPadding(TreeViewAdapter.PaddingLeft*2, 0, 0, 0);return textView;}public long getChildId(int groupPosition, int childPosition) {return childPosition;}public Object getGroup(int groupPosition) {return superTreeNodes.get(groupPosition).parent;}public int getGroupCount() {return superTreeNodes.size();}public long getGroupId(int groupPosition) {return groupPosition;}public boolean isChildSelectable(int groupPosition, int childPosition) {return true;}public boolean hasStableIds() {return true;}
}
复制代码

ExpandableListViewActivity.java

复制代码
List<SuperTreeViewAdapter.SuperTreeNode> superNodeTree = superAdapter.GetTreeNode();forint i = 0; i < parent.length; i++) {SuperTreeViewAdapter.SuperTreeNode superNode = new SuperTreeViewAdapter.SuperTreeNode();superNode.parent = parent[i];forint j = 0; j < child_grandchild.length; j++) {TreeViewAdapter.TreeNode node = new TreeViewAdapter.TreeNode();node.parent = child_grandchild[j][0][0];forint k = 0; k < child_grandchild[j][1].length; k++) {node.childs.add(child_grandchild[j][1][k]);}superNode.childs.add(node);}superNodeTree.add(superNode);}        superAdapter.UpdateTreeNode(superNodeTree);expandableListView.setAdapter(superAdapter);
复制代码

main.xml

复制代码
<LinearLayoutandroid:id="@+id/linearLayout1"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_gravity="center"android:gravity="center" ><Buttonandroid:id="@+id/button1"android:layout_width="100dip"android:layout_height="wrap_content"android:text="二层结构" /><Buttonandroid:id="@+id/button2"android:layout_width="100dip"android:layout_height="wrap_content"android:text="三层结构" /></LinearLayout><ExpandableListViewandroid:id="@+id/expandablelistview"android:layout_width="fill_parent"android:layout_height="fill_parent"></ExpandableListView>
复制代码


效果图 :

三层列表

 

二层列表

 源码下载:ExpandableListView.rar

这篇关于ExpandableListView实现二层和三层列表源码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1029775

相关文章

SpringBoot+RustFS 实现文件切片极速上传的实例代码

《SpringBoot+RustFS实现文件切片极速上传的实例代码》本文介绍利用SpringBoot和RustFS构建高性能文件切片上传系统,实现大文件秒传、断点续传和分片上传等功能,具有一定的参考... 目录一、为什么选择 RustFS + SpringBoot?二、环境准备与部署2.1 安装 RustF

Nginx部署HTTP/3的实现步骤

《Nginx部署HTTP/3的实现步骤》本文介绍了在Nginx中部署HTTP/3的详细步骤,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学... 目录前提条件第一步:安装必要的依赖库第二步:获取并构建 BoringSSL第三步:获取 Nginx

MyBatis Plus实现时间字段自动填充的完整方案

《MyBatisPlus实现时间字段自动填充的完整方案》在日常开发中,我们经常需要记录数据的创建时间和更新时间,传统的做法是在每次插入或更新操作时手动设置这些时间字段,这种方式不仅繁琐,还容易遗漏,... 目录前言解决目标技术栈实现步骤1. 实体类注解配置2. 创建元数据处理器3. 服务层代码优化填充机制详

Python实现Excel批量样式修改器(附完整代码)

《Python实现Excel批量样式修改器(附完整代码)》这篇文章主要为大家详细介绍了如何使用Python实现一个Excel批量样式修改器,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一... 目录前言功能特性核心功能界面特性系统要求安装说明使用指南基本操作流程高级功能技术实现核心技术栈关键函

Java实现字节字符转bcd编码

《Java实现字节字符转bcd编码》BCD是一种将十进制数字编码为二进制的表示方式,常用于数字显示和存储,本文将介绍如何在Java中实现字节字符转BCD码的过程,需要的小伙伴可以了解下... 目录前言BCD码是什么Java实现字节转bcd编码方法补充总结前言BCD码(Binary-Coded Decima

SpringBoot全局域名替换的实现

《SpringBoot全局域名替换的实现》本文主要介绍了SpringBoot全局域名替换的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录 项目结构⚙️ 配置文件application.yml️ 配置类AppProperties.Ja

Python实现批量CSV转Excel的高性能处理方案

《Python实现批量CSV转Excel的高性能处理方案》在日常办公中,我们经常需要将CSV格式的数据转换为Excel文件,本文将介绍一个基于Python的高性能解决方案,感兴趣的小伙伴可以跟随小编一... 目录一、场景需求二、技术方案三、核心代码四、批量处理方案五、性能优化六、使用示例完整代码七、小结一、

Java实现将HTML文件与字符串转换为图片

《Java实现将HTML文件与字符串转换为图片》在Java开发中,我们经常会遇到将HTML内容转换为图片的需求,本文小编就来和大家详细讲讲如何使用FreeSpire.DocforJava库来实现这一功... 目录前言核心实现:html 转图片完整代码场景 1:转换本地 HTML 文件为图片场景 2:转换 H

C#使用Spire.Doc for .NET实现HTML转Word的高效方案

《C#使用Spire.Docfor.NET实现HTML转Word的高效方案》在Web开发中,HTML内容的生成与处理是高频需求,然而,当用户需要将HTML页面或动态生成的HTML字符串转换为Wor... 目录引言一、html转Word的典型场景与挑战二、用 Spire.Doc 实现 HTML 转 Word1

C#实现一键批量合并PDF文档

《C#实现一键批量合并PDF文档》这篇文章主要为大家详细介绍了如何使用C#实现一键批量合并PDF文档功能,文中的示例代码简洁易懂,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言效果展示功能实现1、添加文件2、文件分组(书签)3、定义页码范围4、自定义显示5、定义页面尺寸6、PDF批量合并7、其他方法