android树形菜单

一、概述

  项目要求:搞一个树形菜单用户展示:公司-->部门--->员工。公司下有多部门,部门下有员工。

  开源项目

二、代码示例

/**
 * TreeView列表
 * https://github.com/bmelnychuk/AndroidTreeView
 */
class TreeViewListActivity : FragmentActivity() {
    private var counter = 0
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_tree_view_list)
//        initViews()
        initData()
        initView()
//        initCustomTreeNode()
    }

    private fun initView() {
        //创建根节点
        val root = TreeNode.root()
        val list = initData()
        list.forEachIndexed { index, treeNodeOneStyleBean ->
            val treeNode1 =
                TreeNode(treeNodeOneStyleBean).setViewHolder(TreeNodeOneStyleHolder(this@TreeViewListActivity))
            setTreeData(treeNode1, treeNodeOneStyleBean)
            root.addChildren(treeNode1)
        }
        val tView = AndroidTreeView(this@TreeViewListActivity, root)
        tView.setDefaultAnimation(true)
        tView.setDefaultContainerStyle(R.style.TreeNodeStyleCustom)
        tView.setDefaultNodeClickListener(nodeClickListener)
        tView.setDefaultNodeLongClickListener(nodeLongClickListener)
        container.addView(tView.view)
    }

    /**
     * 递归设置tree数据
     */
    private fun setTreeData(node: TreeNode, nodeBean: TreeNodeStyleBean) {
        nodeBean.treeList.forEachIndexed { index, treeNodeStyleBean ->
            Log.e("setTreeData:", nodeBean.styleType.toString())
            when (treeNodeStyleBean.styleType) {
                0 -> {
                    val treeNode1 =
                        TreeNode(treeNodeStyleBean).setViewHolder(TreeNodeOneStyleHolder(this@TreeViewListActivity))
                    node.addChildren(treeNode1)
                    setTreeData(treeNode1, treeNodeStyleBean)
                }
                1 -> {
                    val treeNode2 =
                        TreeNode(treeNodeStyleBean).setViewHolder(TreeNodeTwoStyleHolder(this@TreeViewListActivity))
                    node.addChildren(treeNode2)
                    setTreeData(treeNode2, treeNodeStyleBean)
                }
                2 -> {
                    val treeNode3 =
                        TreeNode(treeNodeStyleBean).setViewHolder(
                            TreeNodeThreeStyleHolder(this@TreeViewListActivity)
                        )
                    node.addChildren(treeNode3)
                    setTreeData(treeNode3, treeNodeStyleBean)
                }
            }
        }
    }

    private fun fillDownloadsFolder(node: TreeNode) {
        val downloads = TreeNode(IconTreeItem(0, "Downloads" + counter++))
        node.addChild(downloads)
        if (counter < 5) {
            fillDownloadsFolder(downloads)
        }
    }

    private val nodeClickListener =
        TreeNodeClickListener { node, value ->
            ToastUtils.s(this@TreeViewListActivity, "您点击了:${node.isLastChild}")
        }

    private val nodeLongClickListener =
        TreeNodeLongClickListener { node, value ->
            true
        }


    private fun initCustomTreeNode() {
        //创建根节点
        val root = TreeNode.root()
        //创建一级目录
        val treeNode1 =
            TreeNode(TreeNodeOneStyleBean()).setViewHolder(TreeNodeOneStyleHolder(this@TreeViewListActivity))
        val treeNode2 =
            TreeNode(TreeNodeOneStyleBean()).setViewHolder(TreeNodeOneStyleHolder(this@TreeViewListActivity))
        val treeNode3 =
            TreeNode(TreeNodeOneStyleBean()).setViewHolder(TreeNodeOneStyleHolder(this@TreeViewListActivity))
        addTwoStyleNode(treeNode1)
        addTwoStyleNode(treeNode3)
        addTwoStyleNode(treeNode2)
        root.addChildren(treeNode1, treeNode2, treeNode3)

        val tView = AndroidTreeView(this@TreeViewListActivity, root)
        tView.setDefaultAnimation(true)
        tView.setDefaultContainerStyle(R.style.TreeNodeStyleCustom)
        tView.setDefaultNodeClickListener(nodeClickListener)
        tView.setDefaultNodeLongClickListener(nodeLongClickListener)
        container.addView(tView.view)
    }

    private fun addTwoStyleNode(node: TreeNode) {
        val treeNode1 =
            TreeNode(TreeNodeTwoStyleBean()).setViewHolder(TreeNodeTwoStyleHolder(this@TreeViewListActivity))
        val treeNode2 =
            TreeNode(TreeNodeTwoStyleBean()).setViewHolder(TreeNodeTwoStyleHolder(this@TreeViewListActivity))
        val treeNode3 =
            TreeNode(TreeNodeTwoStyleBean()).setViewHolder(TreeNodeTwoStyleHolder(this@TreeViewListActivity))
        addTwoStyleNode2(treeNode1)
        addThreeStyleNode(treeNode2)
        addThreeStyleNode(treeNode3)
        node.addChildren(treeNode1, treeNode2, treeNode3)
    }

    private fun addTwoStyleNode2(node: TreeNode) {
        val treeNode1 =
            TreeNode(TreeNodeTwoStyleBean()).setViewHolder(TreeNodeTwoStyleHolder(this@TreeViewListActivity))
        val treeNode2 =
            TreeNode(TreeNodeTwoStyleBean()).setViewHolder(TreeNodeTwoStyleHolder(this@TreeViewListActivity))
        val treeNode3 =
            TreeNode(TreeNodeTwoStyleBean()).setViewHolder(TreeNodeTwoStyleHolder(this@TreeViewListActivity))
        addThreeStyleNode(treeNode1)
        addThreeStyleNode(treeNode2)
        addThreeStyleNode(treeNode3)
        node.addChildren(treeNode1, treeNode2, treeNode3)
    }

    private fun addThreeStyleNode(node: TreeNode) {
        val treeNode1 =
            TreeNode(TreeNodeThreeStyleBean()).setViewHolder(TreeNodeThreeStyleHolder(this@TreeViewListActivity))
        val treeNode2 =
            TreeNode(TreeNodeThreeStyleBean()).setViewHolder(TreeNodeThreeStyleHolder(this@TreeViewListActivity))
        val treeNode3 =
            TreeNode(TreeNodeThreeStyleBean()).setViewHolder(TreeNodeThreeStyleHolder(this@TreeViewListActivity))
        node.addChildren(treeNode1, treeNode2, treeNode3)
    }

    private fun initData(): ArrayList<TreeNodeStyleBean> {
        val list1 = ArrayList<TreeNodeStyleBean>()
        //第一层数据源
        val bean1 = TreeNodeStyleBean(styleType = 0)
        val bean2 = TreeNodeStyleBean(styleType = 0)
        val bean3 = TreeNodeStyleBean(styleType = 0)
        list1.add(bean1)
        list1.add(bean2)
        list1.add(bean3)

        //第二层数据源
        val twoBean1 = TreeNodeStyleBean(styleType = 1)
        val twoBean2 = TreeNodeStyleBean(styleType = 1)
        val twoBean3 = TreeNodeStyleBean(styleType = 1)
        val list2 = ArrayList<TreeNodeStyleBean>()
        list2.add(twoBean1)
        list2.add(twoBean2)
        list2.add(twoBean3)
        bean1.treeList = list2
        bean2.treeList = list2
        bean3.treeList = list2

        //第三层数据源
        val threeBean1 = TreeNodeStyleBean(styleType = 2)
        val threeBean2 = TreeNodeStyleBean(styleType = 2)
        val threeBean3 = TreeNodeStyleBean(styleType = 2)
        val list3 = ArrayList<TreeNodeStyleBean>()
        list3.add(threeBean1)
        list3.add(threeBean2)
        list3.add(threeBean3)
        twoBean1.treeList = list3
        twoBean2.treeList = list3
        twoBean3.treeList = list3
        return list1
    }
}

 

  

posted on 2024-06-28 10:33  飘杨......  阅读(155)  评论(0)    收藏  举报