自定义树形结构组件—TreeView
注:该文章为(男人应似海)原创,如需转载请注明出处!
组件功能
实现树形结构目录效果
效果图
实现方式
用两个树形节点类集合分别去存储所有节点(List treeElements)和当前显示节点(List currentElements),当前显示节点集合currentElements中的数据显示在ListView中。当点击含有子节点的节点时(如上图中的A、B、C、CC11)会把相应的子节点从所有节点集合treeElements中找到并添加当前显示节点集合currentElements中在ListView上显示或从currentElements中删除并从ListView刷新数据。
关于数据获取
这里获取树节点数据的方式是在工程资源中assets文件下创建一个本地文件(先在assets文件下创建textRes文件夹,然后在textRes文件夹下创建一个记录数据的文件,这里是treeview_elements.properties)如下图所示。
这个文件以某种格式记录数据参数(和树节点类属性对应),具体请查看下面的代码解释。
treeview_elements.properties文件中数据如下:
#id(s)-level(int)-title(s)-fold(b)-hasChild(b)-hasParent(b)-parentId(s)
1011-1-A-false-true-false-null
1021-2-AA11-false-false-true-1011
1022-2-AA22-false-false-true-1011
1023-2-AA33-false-false-true-1011
1024-2-AA44-false-false-true-1011
2011-1-B-false-true-false-null
2021-2-BB11-false-false-true-2011
2022-2-BB22-false-false-true-2011
2023-2-BB33-false-false-true-2011
2024-2-BB44-false-false-true-2011
3011-1-C-false-true-false-null
3021-2-CC11-false-true-true-3011
3031-3-CCC111-false-false-true-3021
3032-3-CCC222-false-false-true-3021
3033-3-CCC333-false-false-true-3021
以#开始的行为注释行,用于说明数据的含义和属性,其他的每行数据都代表了一个树节点对象实例TreeElement。如1021-2-AA11-false-false-true-1011解释如下:
数据
含义
1021
表示该节点id为1021
2
表示该节点为2级节点
AA11
表示该节点的标题或内容为AA11
false
表示该节点当前是处于为展开状态,即子节点不可见(只针对有子节点的节点)
false
表示该节点没有子节点
true
表示该节点有父节点
1011
表示该节点的父节点是1011
这种方式适合于数据量大且数据固定的情况,当数据较少时我们也可以通过直接new树节点对象来得到树节点集合。如果需要获取网络数据,也可以指定服务器返回特定格式的json数据,然后解析。
代码
TreeElement.java
/**
* 类名:TreeElement.java
* 类描述:树形结构节点类
* @author wader
* 创建时间:2011-11-03 16:32
*/
public class TreeElement {
String id = null;// 当前节点id
String title = null;// 当前节点文字
boolean hasParent = false;// 当前节点是否有父节点
boolean hasChild = false;// 当前节点是否有子节点
boolean childShow = false;// 如果子节点,字节当当前是否已显示
String parentId = null;// 父节点id
int level = -1;// 当前界面层级
boolean fold = false;// 是否处于展开状态
public boolean isChildShow() {
return childShow;
}
public void setChildShow(boolean childShow) {
this.childShow = childShow;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public boolean isHasParent() {
return hasParent;
}
public void setHasParent(boolean hasParent) {
this.hasParent = hasParent;
}
public boolean isHasChild() {
return hasChild;
}
public void setHasChild(boolean hasChild) {
this.hasChild = hasChild;
}
public String getParentId() {
return parentId;
}
public void setParentId(String parentId) {
this.parentId = parentId;
}
public int getLevel() {
return level;
}
public void setLevel(int level) {
this.level = level;
}
public boolean isFold() {
return fold;
}
public void setFold(boolean fold) {
this.fold = fold;
}
@Override
public String toString() {
return "id:" + this.id + "-level:" + this.level + "-title:"
+ this.title + "-fold:" + this.fold + "-hasChidl:"
+ this.hasChild + "-hasParent:" + this.hasParent + "-parentId:"+ this.parentId;
}
}
TreeViewAdapter.java
/**
* 类名:TreeViewAdapter.java
* 类描述:用于填充数据的类
* @author wader
* 创建时间:2011-11-03 16:32
*/
public class TreeViewAdapter extends BaseAdapter {
class ViewHolder {
ImageView icon;
TextView title;
}
Context cont