1# TreeView
2
3
4树视图作为一种分层显示的列表,适合显示嵌套结构。拥有父列表项和子列表项,可展开或折叠。
5
6
7用于效率型应用,如备忘录、电子邮件、图库中的侧边导航栏中。
8
9
10> **说明:**
11>
12> 该组件从API Version 10开始支持。后续版本如有新增内容,则采用上角标单独标记该内容的起始版本。
13
14
15## 导入模块
16
17```
18import { TreeView } from "@kit.ArkUI"
19```
20
21
22## 子组件
23
2425
26## 属性
27不支持[通用属性](ts-universal-attributes-size.md)。
28
29## TreeView
30
31TreeView({ treeController: TreeController })
32
33**装饰器类型:**\@Component
34
35**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
36
37**系统能力:** SystemCapability.ArkUI.ArkUI.Full
38
39
40| 名称 | 类型 | 必填 | 说明 |
41| -------- | -------- | -------- | -------- |
42| treeController | [TreeController](#treecontroller) | 是 | 树视图节点信息。 |
43
44
45## TreeController
46
47树视图组件的控制器,可以将此对象绑定至树视图组件,然后通过它控制树的节点信息,同一个控制器不可以控制多个树视图组件。
48
49**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
50
51**系统能力:** SystemCapability.ArkUI.ArkUI.Full
52
53
54### addNode
55
56
57addNode(nodeParam?: NodeParam): TreeController
58
59点击某个节点后,调用该方法可以触发新增孩子节点。
60
61**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
62
63**系统能力:** SystemCapability.ArkUI.ArkUI.Full
64
65
66| 名称 | 类型 | 必填 | 说明 |
67| -------- | -------- | -------- | -------- |
68| nodeParam | [NodeParam](#nodeparam) | 否 | 节点信息。 |
69
70**返回值:**
71
72| 类型                              | 说明                 |
73| --------------------------------- | -------------------- |
74| [TreeController](#treecontroller) | 树视图组件的控制器。 |
75
76### removeNode
77
78removeNode(): void
79
80点击某个节点后,调用该方法可以触发删除该节点。
81
82**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
83
84**系统能力:** SystemCapability.ArkUI.ArkUI.Full
85
86
87### modifyNode
88
89
90modifyNode(): void
91
92点击某个节点后,调用该方法可以触发修改该节点。
93
94**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
95
96**系统能力:** SystemCapability.ArkUI.ArkUI.Full
97
98
99### buildDone
100
101buildDone(): void
102
103建立树视图。节点增加完毕后,必须调用该方法,触发树信息的保存。
104
105**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
106
107**系统能力:** SystemCapability.ArkUI.ArkUI.Full
108
109
110### refreshNode
111
112refreshNode(parentId: number, parentSubTitle: ResourceStr, currentSubtitle: ResourceStr): void
113
114更新树视图。调用该方法,更新当前节点的信息。
115
116**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
117
118**系统能力:** SystemCapability.ArkUI.ArkUI.Full
119
120| 名称 | 类型 | 必填 | 说明 |
121| -------- | -------- | -------- | -------- |
122| parentId | number | 是 | 父节点Id。 |
123| parentSubTitle | [ResourceStr](ts-types.md#resourcestr) | 是 | 父节点副文本。 |
124| currentSubtitle | [ResourceStr](ts-types.md#resourcestr) | 是 | 当前节点副文本。 |
125
126## NodeParam
127
128**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
129
130**系统能力:** SystemCapability.ArkUI.ArkUI.Full
131
132| 名称 | 类型 | 必填 | 说明 |
133| -------- | -------- | -------- | -------- |
134| parentNodeId | number | 否 | 父节点。 |
135| currentNodeId | number | 否 | 当前子节点。 |
136| isFolder | boolean | 否 | 是否是目录。默认值:false。true:是目录,false:不是目录。 |
137| icon | [ResourceStr](ts-types.md#resourcestr) | 否 | 图标。 |
138| selectedIcon | [ResourceStr](ts-types.md#resourcestr) | 否 | 选中图标。 |
139| editIcon | [ResourceStr](ts-types.md#resourcestr) | 否 | 编辑图标。 |
140| primaryTitle | [ResourceStr](ts-types.md#resourcestr) | 否 | 主标题。 |
141| secondaryTitle | [ResourceStr](ts-types.md#resourcestr) | 否 | 副标题。 |
142| container | () => void | 否 | 绑定在节点上的右键子组件,子组件由@Builder修饰。 |
143
144
145## TreeListenerManager
146
147树视图组件的监听器,可以将此对象绑定至树视图组件,然后通过它监听树的节点的变化,同一个监听器不可以控制多个树视图组件。
148
149
150### getInstance
151
152static getInstance(): TreeListenerManager
153
154获取监听管理器单例对象。
155
156**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
157
158**系统能力:** SystemCapability.ArkUI.ArkUI.Full
159
160**返回值**:
161
162| 类型              | 说明               |
163| --------------- |------------------|
164| [TreeListenerManager](#treelistenermanager) | 返回获取到的监听管理器单例对象。 |
165
166
167### getTreeListener
168
169getTreeListener(): TreeListener
170
171获取监听器。
172
173**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
174
175**系统能力:** SystemCapability.ArkUI.ArkUI.Full
176
177**返回值**:
178
179| 类型           | 说明         |
180| ------------ |------------|
181| [TreeListener](#treelistener) | 返回获取到的监听器。 |
182
183
184## TreeListener
185
186树视图组件的监听器,可以将此对象绑定至树视图组件,然后通过它监听树的节点的变化,同一个监听器不可以控制多个树视图组件。
187
188
189### on
190
191on(type: TreeListenType, callback: (callbackParam: CallbackParam) => void): void;
192
193注册监听。
194
195**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
196
197**系统能力:** SystemCapability.ArkUI.ArkUI.Full
198
199| 名称 | 类型 | 必填 | 说明 |
200| -------- | -------- | -------- | -------- |
201| type | [TreeListenType](#treelistentype) | 是 | 监听类型。 |
202| callback | (callbackParam: [CallbackParam](#callbackparam)) => void | 是 | 节点信息。 |
203
204
205### once
206
207once(type: TreeListenType, callback: (callbackParam: CallbackParam) => void): void;
208
209注册一次监听。
210
211**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
212
213**系统能力:** SystemCapability.ArkUI.ArkUI.Full
214
215| 名称 | 类型 | 必填 | 说明 |
216| -------- | -------- | -------- | -------- |
217| type | [TreeListenType](#treelistentype) | 是 | 监听类型。 |
218| callback | (callbackParam: [CallbackParam](#callbackparam)) => void | 是 | 节点信息。 |
219
220
221### off
222
223
224off(type: TreeListenType, callback?: (callbackParam: CallbackParam) => void): void;
225
226取消监听。
227
228**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
229
230**系统能力:** SystemCapability.ArkUI.ArkUI.Full
231
232
233| 名称 | 类型 | 必填 | 说明 |
234| -------- | -------- | -------- | -------- |
235| type | [TreeListenType](#treelistentype) | 是 | 监听类型。 |
236| callback | (callbackParam: [CallbackParam](#callbackparam)) => void | 否 | 节点信息。 |
237
238## TreeListenType
239
240**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
241
242**系统能力:** SystemCapability.ArkUI.ArkUI.Full
243
244| 名称 | 值 | 说明 |
245| -------- | -------- | -------- |
246| NODE_CLICK | "NodeClick" | 监听节点点击事件。 |
247| NODE_ADD | "NodeAdd" | 监听节点增加事件。 |
248| NODE_DELETE | "NodeDelete" | 监听节点删除事件。 |
249| NODE_MODIFY | "NodeModify" | 监听节点修改事件。 |
250| NODE_MOVE | "NodeMove" | 监听节点移动事件。 |
251
252## CallbackParam
253
254**原子化服务API:** 从API version 11开始,该接口支持在原子化服务中使用。
255
256**系统能力:** SystemCapability.ArkUI.ArkUI.Full
257
258| 名称 | 类型 | 必填 | 说明 |
259| -------- | -------- | -------- | -------- |
260| currentNodeId | number | 是 | 当前子节点。 |
261| parentNodeId | number | 否 | 父节点。 |
262| childIndex | number | 否 | 子索引。 |
263
264## 事件
265不支持[通用事件](ts-universal-events-click.md)。
266
267## 示例
268通过树视图组件的控制器对树的节点进行新增、删除、重命名,展示新增不同参数节点的实现效果。
269```ts
270import { TreeController, TreeListener, TreeListenerManager, TreeListenType, NodeParam, TreeView, CallbackParam } from '@kit.ArkUI'
271
272@Entry
273@Component
274struct TreeViewDemo {
275  private treeController: TreeController = new TreeController();
276  private treeListener: TreeListener = TreeListenerManager.getInstance().getTreeListener();
277  @State clickNodeId: number = 0;
278
279  aboutToDisappear(): void {
280    this.treeListener.off(TreeListenType.NODE_CLICK, undefined);
281    this.treeListener.off(TreeListenType.NODE_ADD, undefined);
282    this.treeListener.off(TreeListenType.NODE_DELETE, undefined);
283    this.treeListener.off(TreeListenType.NODE_MOVE, undefined);
284  }
285
286  @Builder menuBuilder1() {
287    Flex({ direction: FlexDirection.Column, justifyContent: FlexAlign.Center, alignItems: ItemAlign.Center }) {
288      Text('新增').fontSize(16).width(100).height(30).textAlign(TextAlign.Center)
289        .onClick((event: ClickEvent) => {
290          this.treeController.addNode();
291        })
292      Divider()
293      Text('删除').fontSize(16).width(100).height(30).textAlign(TextAlign.Center)
294        .onClick((event: ClickEvent) => {
295          this.treeController.removeNode();
296        })
297      Divider()
298      Text('重命名').fontSize(16).width(100).height(30).textAlign(TextAlign.Center)
299        .onClick((event: ClickEvent) => {
300          this.treeController.modifyNode();
301        })
302    }.width(100).border({width: 1, color: 0x80808a, radius: '16dp'})
303  }
304
305  aboutToAppear(): void {
306    this.treeListener.on(TreeListenType.NODE_CLICK, (callbackParam: CallbackParam) => {
307      this.clickNodeId = callbackParam.currentNodeId;
308    })
309    this.treeListener.on(TreeListenType.NODE_ADD, (callbackParam: CallbackParam) => {
310      this.clickNodeId = callbackParam.currentNodeId;
311    })
312    this.treeListener.on(TreeListenType.NODE_DELETE, (callbackParam: CallbackParam) => {
313      this.clickNodeId = callbackParam.currentNodeId;
314    })
315    this.treeListener.once(TreeListenType.NODE_MOVE, (callbackParam: CallbackParam) => {
316      this.clickNodeId = callbackParam.currentNodeId;
317    })
318
319    let normalResource: Resource = $r('app.media.ic_public_collect_normal');
320    let selectedResource: Resource = $r('app.media.ic_public_collect_selected');
321    let editResource: Resource = $r('app.media.ic_public_collect_edit');
322    let nodeParam: NodeParam = { parentNodeId:-1, currentNodeId: 1, isFolder: true, icon: normalResource, selectedIcon: selectedResource,
323      editIcon: editResource, primaryTitle: "目录1验证悬浮框自适应效果是否OK",
324      secondaryTitle: "6" };
325    this.treeController
326      .addNode(nodeParam)
327      .addNode({parentNodeId:1, currentNodeId: 2, isFolder: false, primaryTitle: "项目1_1" })
328      .addNode({ parentNodeId:-1, currentNodeId: 7, isFolder: true, primaryTitle: "目录2" })
329      .addNode({ parentNodeId:-1, currentNodeId: 23, isFolder: true, icon: normalResource, selectedIcon: selectedResource,
330        editIcon: editResource, primaryTitle: "目录3" })
331      .addNode({ parentNodeId:-1, currentNodeId: 24, isFolder: false, primaryTitle: "项目4" })
332      .addNode({ parentNodeId:-1, currentNodeId: 31, isFolder: true, icon: normalResource, selectedIcon: selectedResource,
333        editIcon: editResource, primaryTitle: "目录5", secondaryTitle: "0" })
334      .addNode({ parentNodeId:-1, currentNodeId: 32, isFolder: true, icon: normalResource, selectedIcon: selectedResource,
335        editIcon: editResource, primaryTitle: "目录6", secondaryTitle: "0" })
336      .addNode({ parentNodeId:32, currentNodeId: 35, isFolder: true, icon: normalResource, selectedIcon: selectedResource,
337        editIcon: editResource, primaryTitle: "目录6-1", secondaryTitle: "0" })
338      .addNode({ parentNodeId:-1, currentNodeId: 33, isFolder: true, icon: normalResource, selectedIcon: selectedResource,
339        editIcon: editResource, primaryTitle: "目录7", secondaryTitle: "0" })
340      .addNode({ parentNodeId:33, currentNodeId: 34, isFolder: false, primaryTitle: "项目8" })
341      .addNode({ parentNodeId:-1, currentNodeId: 36, isFolder: false, primaryTitle: "项目9" })
342      .buildDone();
343    this.treeController.refreshNode(-1, "父节点", "子节点");
344  }
345
346  build() {
347    Column(){
348      SideBarContainer(SideBarContainerType.Embed)
349      {
350        TreeView({ treeController: this.treeController })
351        Row() {
352          Divider().vertical(true).strokeWidth(2).color(0x000000).lineCap(LineCapStyle.Round)
353          Column({ space: 30 }) {
354            Text('ClickNodeId=' + this.clickNodeId).fontSize('16fp')
355            Button('Add', { type: ButtonType.Normal, stateEffect: true })
356              .borderRadius(8).backgroundColor(0x317aff).width(90)
357              .onClick((event: ClickEvent) => {
358                this.treeController.addNode();
359              })
360            Button('Modify', { type: ButtonType.Normal, stateEffect: true })
361              .borderRadius(8).backgroundColor(0x317aff).width(90)
362              .onClick((event: ClickEvent) => {
363                this.treeController.modifyNode();
364              })
365            Button('Remove', { type: ButtonType.Normal, stateEffect: true })
366              .borderRadius(8).backgroundColor(0x317aff).width(120)
367              .onClick((event: ClickEvent) => {
368                this.treeController.removeNode();
369              })
370          }.height('100%').width('70%').alignItems(HorizontalAlign.Start).margin(10)
371        }
372      }
373      .focusable(true)
374      .showControlButton(false)
375      .showSideBar(true)
376    }
377  }}
378```
379
380![zh-cn_image_0000001664822257](figures/zh-cn_image_0000001664822257.png)
381