Android Listview Tree

                      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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值