Listview树。效果如下:
简要说明实现方案
通过List的删除添加以及配合Adapter的notifyDataSetChanged的实现。
通过自定义的node中的childNodes来控制隐藏的item
简单展示一下核心模块的代码:
listview模块:
listView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view,
int position, long id) {
NodeView nv = (NodeView) view;
Node node = nv.getData();
//设置箭头图标
node.setSelected(!node.isSelected());
if(node.isSelected()){
//添加子node对象
if(node.getChildNodes()!=null&&node.getChildNodes().size()>0){
NodeUtils.addNodes(nodes, position, node.getChildNodes(),node.getRetractNum());
}
}else{
//删除node对象
NodeUtils.deleteNodes(nodes, position, node.getChildNodes());
}
adapter.notifyDataSetChanged();
//用户可以定义的方法//
showMsg("[item所在位置:"+node.getPosition()+"]|"+"[名称:"+node.getName()+"]");//展示数据
}
});
对list的添加删除操作类:
package com.example.tree;
import java.util.ArrayList;
import java.util.List;
/**
* Node助手类 主要提供对node的添加删除操作
* @author yuliang
*
*/
public class NodeUtils {
/**
* 添加node对象
* @param nodes 源数据
* @param index 添加开始的索引
* @param addDatas 添加的数据
* @param retractNum 为添加后的数据添加缩进
*/
public static void addNodes(List<Node> nodes,int index,List<Node> addDatas,int retractNum){
index++;
retractNum++;
if(addDatas==null||addDatas.size()==0){
return ;
}
if(nodes==null){
nodes = new ArrayList<Node>();
}
for (int i = 0; i < addDatas.size(); i++) {
Node n = addDatas.get(i);
n.setRetractNum(retractNum);
nodes.add(index+i,n);
}
}
/**
* 删除node对象
* @param nodes 源数据
* @param index 删除开始索引
* @param deleteDatas 删除的数据
*/
public static void deleteNodes(List<Node> nodes,int index,List<Node> deleteDatas){
if(deleteDatas==null||deleteDatas.size()==0){
return ;
}
if(nodes==null||nodes.size()==0){
return ;
}
index++;
int deleteLength = getOpenNodeLength(deleteDatas);
for (int i = 0; i < deleteLength; i++) {
nodes.set(i+index, null);
}
while (nodes.contains(null)) {
nodes.remove(null);
}
}
/**
* 获取要删除的node的长度
* @param deleteDatas 要删除的node数据对象
* @return
*/
public static int getOpenNodeLength(List<Node> deleteDatas){
if(deleteDatas==null||deleteDatas.size()==0){
return 0;
}
int l = deleteDatas.size();
for (int i = 0; i < deleteDatas.size(); i++) {
Node n = deleteDatas.get(i);
int length = 0;
if(n.isSelected()){
length = getOpenNodeLength(n.getChildNodes());
}
//删除了数据以后改变node的箭头指向
n.setSelected(false);
l+=length;
}
return l;
}
}
源代码下载地址:http://download.csdn.net/detail/woaixinxin123/6552137
QQ交流群:255825960