Unity 资源树VirtualizingTreeView使用方式

实现资源树,树形结构,使用VirtualizingTreeView插件

其核心代码如下  展开数据、绑定数据,数据事件选择:

    [SerializeField]
    private VirtualizingTreeView m_Tree;       

 /// <summary>
    /// 初始化
    /// </summary>
    public void InitTree()
    {
        //树的数据绑定
        m_Tree.ItemDataBinding += Blind;
        //树节点的选中
        m_Tree.SelectionChanged += Selected;
        //树节点的展开
        m_Tree.ItemExpanding += Expand;


        var data = TestData("5445131", Org.station);
        data.Children.Add(TestData("54568731", Org.station));
      
       // m_Tree.Items = new List<TreeNode>() { data };//加载树
        treeNodes.Add(data);
        //初始化
        m_Tree.Items = treeNodes;
    }
/// <summary>
    /// 展开关闭
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void Expand(object sender, VirtualizingItemExpandingArgs e)
    {
        var data = e.Item as TreeNode;
        if (data == null) return;
        e.Children = data.Children;
    }
    /// <summary>
    /// 选中,可点击,双击....
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void Selected(object sender, SelectionChangedArgs e)
    {
        if (e.NewItem == null) return;
        var treeNode = e.NewItem as TreeNode;
        currentNode = treeNode;
        content.text= currentNode.id + " ---  " + currentNode.type.ToString();
    }
    /// <summary>
    /// 绑定数据
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void Blind(object sender, VirtualizingTreeViewItemDataBindingArgs e)
    {
        var treeNode = e.Item as TreeNode;Debug.Log(treeNode);
        if (treeNode == null) return;
        e.HasChildren = treeNode.Children.Count > 0;
        var item = e.ItemPresenter.GetComponent<UI_TreeViewItem>();
        item.m_Tetx.text = treeNode.name;
        if (treeNode.Children.Count<=0)
        {
            item.icon.gameObject.SetActive(false);
        }
        else
        {
            item.icon.sprite = item.icon_file;
            item.icon.gameObject.SetActive(true);
        }
    }

其核心思想,就是利用对象池,实现对数据的增删查改;

具体实现如下:

先创建一个节点类:

/* ============================================================================== 
* 创 建 者:$username$ 
* 创建日期:$time$ 
* 功能描述:$safeitemrootname$ 
* ==============================================================================*/
using System.Collections.Generic;
public enum Org
{
    station=0,
    car=1,
    police=2
}

public class TreeNode
{
    /// <summary>
    ///  节点id
    /// </summary>
    public string id;
    /// <summary>
    ///  名称
    /// </summary>
    public string name;
    /// <summary>
    ///   父id
    /// </summary>
    public string parentId;
    /// <summary>
    ///  类型 
    /// </summary>
    public Org type;
    /// <summary>
    ///  设备状态。
    /// </summary>
    public string statue;

    /// <summary>
    /// 子节点
    /// </summary>
    [System.Xml.Serialization.XmlIgnore]
    public IList<TreeNode> Children;

    public TreeNode()
    {
        Children = new List<TreeNode>();
    }
}

然后对节点类进行模拟数据:

/* ============================================================================== 
* 创 建 者:$username$ 
* 创建日期:$time$ 
* 功能描述:$safeitemrootname$ 
* ==============================================================================*/
using Battlehub.UIControls;
using System;
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class TreeExample : MonoBehaviour {
    [SerializeField]
    private VirtualizingTreeView m_Tree;
    [SerializeField]
    private Button btn_Addstation;
    [SerializeField]
    private Button btn_Addcar;
    [SerializeField]
    private Button btn_Addperson;
    [SerializeField]
    private Text  content;

    //选中数据源
    private TreeNode currentNode;

    //当前数据源
    private List<TreeNode> treeNodes;

    // Use this for initialization
    void Start () {
        treeNodes = new List<TreeNode>();
        btn_Addstation.onClick.AddListener(Addstation);
        btn_Addcar.onClick.AddListener(Addcar);
        btn_Addperson.onClick.AddListener(Addperson);
        InitTree();
    }
    /// <summary>
    /// 点击添加数据
    /// </summary>
    private void Addstation()
    {
        if (content.text == "") return;
        if (currentNode.type == Org.police || currentNode.type == Org.car) return;
        var obj=  TestData(currentNode.id, Org.station);
        currentNode.Children.Add(obj);
    }
    /// <summary>
    /// 点击添加数据
    /// </summary>
    private void Addcar()
    {
        if (content.text == "") return;
        if (currentNode.type == Org.police) return;
        var obj = TestData(currentNode.id, Org.car);
        currentNode.Children.Add(obj);
    }
    /// <summary>
    /// 点击添加数据
    /// </summary>
    private void Addperson()
    {
        if (content.text == "") return;
        var obj = TestData(currentNode.id, Org.police);
        currentNode.Children.Add(obj);
    }

    int i = 0;//测试数据
    private TreeNode TestData(string parentid,Org org)
    {
        i++;
        return new TreeNode
        {
            id = Guid.NewGuid().ToString(),
            name= org.ToString(),
            type=org,
            parentId= parentid,
        };
    }



    /// <summary>
    /// 初始化
    /// </summary>
    public void InitTree()
    {
        //树的数据绑定
        m_Tree.ItemDataBinding += Blind;
        //树节点的选中
        m_Tree.SelectionChanged += Selected;
        //树节点的展开
        m_Tree.ItemExpanding += Expand;


        var data = TestData("5445131", Org.station);
        data.Children.Add(TestData("54568731", Org.station));
      
       // m_Tree.Items = new List<TreeNode>() { data };//加载树
        treeNodes.Add(data);
        //初始化
        m_Tree.Items = treeNodes;
    }

    /// <summary>
    /// 展开关闭
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void Expand(object sender, VirtualizingItemExpandingArgs e)
    {
        var data = e.Item as TreeNode;
        if (data == null) return;
        e.Children = data.Children;
    }
    /// <summary>
    /// 选中,可点击,双击....
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void Selected(object sender, SelectionChangedArgs e)
    {
        if (e.NewItem == null) return;
        var treeNode = e.NewItem as TreeNode;
        currentNode = treeNode;
        content.text= currentNode.id + " ---  " + currentNode.type.ToString();
    }
    /// <summary>
    /// 绑定数据
    /// </summary>
    /// <param name="sender"></param>
    /// <param name="e"></param>
    private void Blind(object sender, VirtualizingTreeViewItemDataBindingArgs e)
    {
        var treeNode = e.Item as TreeNode;Debug.Log(treeNode);
        if (treeNode == null) return;
        e.HasChildren = treeNode.Children.Count > 0;
        var item = e.ItemPresenter.GetComponent<UI_TreeViewItem>();
        item.m_Tetx.text = treeNode.name;
        if (treeNode.Children.Count<=0)
        {
            item.icon.gameObject.SetActive(false);
        }
        else
        {
            item.icon.sprite = item.icon_file;
            item.icon.gameObject.SetActive(true);
        }
    }

}

实现效果如下:

使用时,直接把预制体拖上去调制所需大小即可用。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值