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