android二级分类选择,Android实现多级树形选择列表

本文介绍如何在Android中实现多级树形选择列表。通过自定义节点实体类Node、设置父子节点关系、使用TreeHelper进行排序和过滤,以及创建自定义的TreeListViewAdapter,实现了动态级别的树形菜单。文章还提供了详细代码示例,包括节点数据实体类、TreeHelper工具类、Adapter以及回调接口的实现。
摘要由CSDN通过智能技术生成

项目中有多个地方要用到多级列表的菜单,最开始我用的是ExpandableListView,但问题是ExpandableListView只支持两级列表,于是我就用ExpandableListView嵌套ExpandableListView,但非常麻烦,而且关键的是具体分几级是不确定的,也就是可能一级,可能多级,这要是五六级嵌套ListView,于是我就去学习鸿洋大神之前写的一篇关于实现Android多级树形列表的文章,实现很巧妙,使用一个ListView就可以实现多级列表效果,我做了部分修改,功能顺利实现。

0133ba1b1e451e0bff4313c422c3c345.png

1.定义节点实体类:

package com.xiaoyehai.multileveltreelist.treelist;

import java.util.ArrayList;

import java.util.List;

/**

* 节点实体类

* Created by xiaoyehai on 2018/7/11 0011.

*/

public class Node {

/**

* 当前节点id

*/

private String id;

/**

* 父节点id

*/

private String pid;

/**

* 节点数据实体类

*/

private T data;

/**

* 设置开启 关闭的图片

*/

public int iconExpand = -1, iconNoExpand = -1;

/**

* 节点名称

*/

private String name;

/**

* 当前的级别

*/

private int level;

/**

* 是否展开

*/

private boolean isExpand = false;

private int icon = -1;

/**

* 下一级的子Node

*/

private List children = new ArrayList<>();

/**

* 父Node

*/

private Node parent;

/**

* 是否被checked选中

*/

private boolean isChecked;

public Node() {

}

public Node(String id, String pid, String name) {

this.id = id;

this.pid = pid;

this.name = name;

}

public Node(String id, String pid, T data, String name) {

this.id = id;

this.pid = pid;

this.data = data;

this.name = name;

}

/**

* 是否为根节点

*

* @return

*/

public boolean isRootNode() {

return parent == null;

}

/**

* 判断父节点是否展开

*

* @return

*/

public boolean isParentExpand() {

if (parent == null)

return false;

return parent.isExpand();

}

/**

* 是否是叶子节点

*

* @return

*/

public boolean isLeaf() {

return children.size() == 0;

}

/**

* 获取当前的级别level

*/

public int getLevel() {

return parent == null ? 0 : parent.getLevel() + 1;

}

/**

* 设置展开

*

* @param isExpand

*/

public void setExpand(boolean isExpand) {

this.isExpand = isExpand;

if (!isExpand) {

for (Node node : children) {

node.setExpand(isExpand);

}

}

}

public String getId() {

return id;

}

public void setId(String id) {

this.id = id;

}

public String getPid() {

return pid;

}

public void setPid(String pid) {

this.pid = pid;

}

public T getData() {

return data;

}

public void setData(T data) {

this.data = data;

}

public int getIconExpand() {

return iconExpand;

}

public void setIconExpand(int iconExpand) {

this.iconExpand = iconExpand;

}

public int getIconNoExpand() {

return iconNoExpand;

}

public void setIconNoExpand(int iconNoExpand) {

this.iconNoExpand = iconNoExpand;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public void setLevel(int level) {

this.level = level;

}

public boolean isExpand() {

return isExpand;

}

public int getIcon() {

return icon;

}

public void setIcon(int icon) {

this.icon = icon;

}

public List getChildren() {

return children;

}

public void setChildren(List children) {

this.children = children;

}

public Node getParent() {

return parent;

}

public void setParent(Node parent) {

this.parent = parent;

}

public boolean isChecked() {

return isChecked;

}

public void setChecked(boolean checked) {

isChecked = checked;

}

}

2.定义每个节点数据的实体类

因为项目中多个地方用到树形菜单,而且数据都不一样,每个节点数据都比较复杂,所以我单独封装出一个类,要是数据和简单,这步可以不用,直接用Node类。

例如:

/**

* 每个节点的具体数据

* Created by xiaoyehai on 2018/7/11 0011.

*/

public class NodeData {

private String name;

publi

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值