android tree树状列表+checkbox

在github上找了好久,想改成自己想要的效果不容易,是终改成了效果,记录一下
1、从服务器传来的数据,可能是深度树状结构,通过递归对树进行遍历
2、把json数据,转换成我们的TreeNode数据。
3、动态的设置list中距离左边的距离,实现伪层次结构。
这里写图片描述

代码调用

package com.example.treedemo;

import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup.LayoutParams;
import android.widget.Button;
import android.widget.RelativeLayout;
import android.widget.TextView;

import com.google.gson.Gson;

import java.util.ArrayList;
import java.util.List;

import bean.TreeData;
import bean.TreeNode;
import view.Node;
import view.NodeResource;
import view.TreeListView;

public class MainActivity extends Activity {

    private TreeListView listView;
    private Button button;
    private Button btn_delect;
    ArrayList<TreeNode> topNodes = new ArrayList<TreeNode>(),
            allNodes = new ArrayList<TreeNode>();
    private TextView text_select;

    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        button = (Button) findViewById(R.id.button);
        btn_delect = (Button) findViewById(R.id.btn_delect);
        text_select = (TextView) findViewById(R.id.text_select);
        RelativeLayout relativeLayout = (RelativeLayout) findViewById(R.id.main_relative_layout);


        RelativeLayout rl = new RelativeLayout(this);
        rl.setLayoutParams(new LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.WRAP_CONTENT));
        listView = new TreeListView(this, initNodeTree());
        List<Node> resultNode = listView.mNodeList;
        relativeLayout.addView(listView);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                ArrayList<Node> list = (ArrayList<Node>) listView.get();
                list.toString();
                if (listView.get().size() == 0) {
                    return;
                }
                String s = "";
                for (int i = 0; i < listView.get().size(); i++) {
                    s += listView.get().get(i).getTitle() + "  ";
                }
                text_select.setText(s);
                Log.i("====list", listView.get() + "");
            }
        });
        btn_delect.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                listView.setUnSelect();
            }
        });


    }

    public List<NodeResource> initNodeTree() {
//        List<NodeResource> list = new ArrayList<NodeResource>();
//        NodeResource n1 = new NodeResource("" + -1, "17018m170diosfvieqh5drn2u30mi1shn5", "智设施测试", "123");
//        list.add(n1);
//        NodeResource n2 = new NodeResource("17018m170diosfvieqh5drn2u30mi1shn5", "17072n261s99viv1piif7pvshj0h3mkke2", "a部门", "123");
//        list.add(n2);
//        NodeResource n3 = new NodeResource("17072n261s99viv1piif7pvshj0h3mkke2", "17072p144434ru15iuhbgrlk0jc05qecj7", "a111", "123");
//        list.add(n3);
//        NodeResource n4 = new NodeResource("17072n261s99viv1piif7pvshj0h3mkke2", "17072p13qjnce5pvocgaupj7qu8qkfgk75", "a222", "123");
//        list.add(n4);
//        NodeResource n5 = new NodeResource("17018m170diosfvieqh5drn2u30mi1shn5", "17072n27rkh63ieb9ggtpqirv8d1j1oh6k", "b部门", "123");
//        list.add(n5);

        getData();
        ArrayList<NodeResource> listTree = new ArrayList<>();
//
        for (int i = 0; i < allNodes.size(); i++) {
            NodeResource nr = new NodeResource(allNodes.get(i).getParendId(),
                    allNodes.get(i).getId(),
                    allNodes.get(i).getContentText(), "123");
            listTree.add(nr);
        }
        return listTree;
    }

    public ArrayList getData() {
        String str = TestData.data;
        Gson gson = new Gson();
        TreeData treeData = gson.fromJson(str, TreeData.class);
        initTreeNodesList(treeData);
        Log.i("-----allNodes", allNodes.size() + "");
        return allNodes;

    }

    private void initTreeNodesList(TreeData roomInfo) {

        if ("-1".equals(roomInfo.getRoomid())) {
            if (roomInfo.getChildren() == null) {
                return;
            }

            for (int i = 0; i < roomInfo.getChildren().size(); i++) {
                //添加节点  -- 节点名称,节点level,节点id,父节点id,是否有子节点,是否展开
                TreeNode rootTreeNode = new TreeNode(roomInfo.getChildren().get(i).getRoomname(),
                        TreeNode.TOP_LEVEL,
                        roomInfo.getChildren().get(i).getRoomid(), TreeNode.NO_PARENT, true, false);
                topNodes.add(rootTreeNode);
                allNodes.add(rootTreeNode);
            }
        } else {
            for (int i = 0; i < allNodes.size(); i++) {
                if (roomInfo.getFroomid().equals(allNodes.get(i).getId())) {
                    TreeNode treeNode = new TreeNode(roomInfo.getRoomname(),
                            allNodes.get(i).getLevel() + 1, roomInfo.getRoomid(), roomInfo.getFroomid(),
                            !"true".equals(roomInfo.getLeaf())
                            , false);
                    allNodes.add(treeNode);
                }
            }
        }

        if (!"true".equals(roomInfo.getLeaf())) {
            for (TreeData info : roomInfo.getChildren()) {
                initTreeNodesList(info);
            }
        }

    }
}

代码下载地址
http://download.csdn.net/detail/androidxiaogang/9783882

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
快速实现Android多级树形列表,这个库是在鸿洋多级树形列表demo修改而来。解决的问题:支持ID为int类型和String类型。支持多级复选框选,使用只需一行代码。支持动态更新数据并保持原有展开/关闭状态。支持ListView、RecyclerView。USE我们关联列表树需要有三个必须元素,当前id、父级id即pid,显示的内容。id和pid可以为int或者String以及其他类型。要显示的内容需要包装一下://id pid name  FileNode为实际用的实体Bean对象 mlist.add(new Node("223","0","我也是添加的root节点",new FileNode()));对于ListView,需要继承自TreeListViewAdapter,如:public class SimpleTreeAdapter extends TreeListViewAdapter {     public SimpleTreeAdapter(ListView mTree, Context context, List datas, int defaultExpandLevel, int iconExpand, int iconNoExpand) {         super(mTree, context, datas, defaultExpandLevel, iconExpand, iconNoExpand);     }     public SimpleTreeAdapter(ListView mTree, Context context, List datas,                              int defaultExpandLevel) {         super(mTree, context, datas, defaultExpandLevel);     }     @Override     public View getConvertView(final Node node , int position, View convertView, ViewGroup parent)     {        final ViewHolder viewHolder ;         if (convertView == null) {             convertView = mInflater.inflate(R.layout.list_item, parent, false);             viewHolder = new ViewHolder();             viewHolder.cb = (CheckBox) convertView                     .findViewById(R.id.cb_select_tree);             viewHolder.label = (TextView) convertView                     .findViewById(R.id.id_treenode_label);             viewHolder.icon = (ImageView) convertView.findViewById(R.id.icon);             convertView.setTag(viewHolder);         } else {             viewHolder = (ViewHolder) convertView.getTag();         }         viewHolder.cb.setOnClickListener(new View.OnClickListener() {             @Override             public void onClick(View v) {                 setChecked(node,viewHolder.cb.isChecked());             }         });         if (node.isChecked()){             viewHolder.cb.setChecked(true);         }else {             viewHolder.cb.setChecked(false);         }         if (node.getIcon() == -1) {             viewHolder.icon.setVisibility(View.INVISIBLE);         } else {             viewHolder.icon.setVisibility(View.VISIBLE);             viewHolder.icon.setImageResource(node.getIcon());         }         viewHolder.label.setText(node.getName());         return convertView;     }     private final class ViewHolder     {         ImageView icon;         CheckBox cb;         TextView label;     } }对于RecyclerView,需继承自TreeRecyclerAdapter,如:public class SimpleTreeRecyclerAdapter extends TreeRecyclerAdapter {     public SimpleTreeRecyclerAdapter(RecyclerView mTree, Context context, List datas, int defaultExpandLevel, int iconExpand, int iconNoExpand) {         super(mTree, context, datas, defaultExpandLevel, iconExpand, iconNoExpand);     }     public SimpleTreeRecyclerAdapter(RecyclerView mTree, Context context, List datas, int defaultExpandLevel) {         super(mTree, context, datas, defaultExpandLevel);     }     @Override     public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {         return new MyHoder(View.inflate(mContext, R.layout.list_item,null));     }     @Override     public void onBindViewHolder(final Node node, RecyclerView.ViewHolder holder, int position) {         final MyHoder viewHolder = (MyHoder) holder;         //todo do something         viewHolder.cb.setOnClickListener(new View.OnClickListener() {             @Override             public void onClick(View v) {                 setChecked(node,viewHolder.cb.isChecked());             }         });         if (node.isChecked()){             viewHolder.cb.setChecked(true);         }else {             viewHolder.cb.setChecked(false);         }         if (node.getIcon() == -1) {             viewHolder.icon.setVisibility(View.INVISIBLE);         } else {             viewHolder.icon.setVisibility(View.VISIBLE);             viewHolder.icon.setImageResource(node.getIcon());         }         viewHolder.label.setText(node.getName());     }     class MyHoder extends RecyclerView.ViewHolder{         public CheckBox cb;         public TextView label;         public ImageView icon;         public MyHoder(View itemView) {             super(itemView);             cb = (CheckBox) itemView                     .findViewById(R.id.cb_select_tree);             label = (TextView) itemView                     .findViewById(R.id.id_treenode_label);             icon = (ImageView) itemView.findViewById(R.id.icon);         }     } }初始化: ListView://第一个参数  ListView //第二个参数  上下文 //第三个参数  数据集 //第四个参数  默认展开层级数 0为不展开 //第五个参数  展开的图标 //第六个参数  闭合的图标 mAdapter = new SimpleTreeAdapter(mTree, ListViewActivity.this,                         mDatas, 1,R.mipmap.tree_ex,R.mipmap.tree_ec); mTree.setAdapter(mAdapter);RecyclerView://第一个参数  RecyclerView //第二个参数  上下文 //第三个参数  数据集 //第四个参数  默认展开层级数 0为不展开 //第五个参数  展开的图标 //第六个参数  闭合的图标 mAdapter = new SimpleTreeRecyclerAdapter(mTree, RecyclerViewActivity.this,                 mDatas, 1,R.mipmap.tree_ex,R.mipmap.tree_ec); mTree.setAdapter(mAdapter);添加数据,可以保持原有选或者展开状态:List mlist = new ArrayList(); mlist.add(new Node("223","0","我也是添加的root节点",new FileNode())); mAdapter.addData(0,mlist);获取选内容:如果node的isChecked()为true,即为选状态。StringBuilder sb = new StringBuilder(); //获取排序过的nodes //如果不需要刻意直接用 mDatas既可 final List allNodes = mAdapter.getAllNodes(); for (int i = 0; i < allNodes.size(); i ) {    if (allNodes.get(i).isChecked()){        sb.append(allNodes.get(i).getName() ",");    } } String strNodesName = sb.toString(); if (!TextUtils.isEmpty(strNodesName))    Toast.makeText(this, strNodesName.substring(0, strNodesName.length()-1),Toast.LENGTH_SHORT).show();控制父子之间联动的选与取消状态,只需调用setChecked方法既可,注意如果在setOnCheckedChangeListener处理会有问题:因为如果要子节点/父节点选或者取消需要刷新页面,而刷新页面又会触发viewHolder.cb.setChecked(true/false);的判断从而又会进入setOnCheckedChangeListener,会导致如果父节点选某些子节点取消不了的情况。//viewHolder.cb 为CheckBox  viewHolder.cb.setOnClickListener(new View.OnClickListener() {             @Override             public void onClick(View v) {                 setChecked(node,viewHolder.cb.isChecked());             }         });
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值