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