实现资源树,树形结构,使用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);
}
}
}
实现效果如下:
使用时,直接把预制体拖上去调制所需大小即可用。