HarmonyOS 鸿蒙Next TreeView组件在ArkUI中如何实现树状结构的展示与节点展开/收起

发布于 1周前 作者 itying888 来自 鸿蒙OS

HarmonyOS 鸿蒙Next TreeView组件在ArkUI中如何实现树状结构的展示与节点展开/收起

TreeView组件用于展示树状结构的数据,如何配置以实现节点的展开和收起,并自定义节点的样式?

2 回复

treeview暂不支持自定义节点样式

关于节点的展开和收起,组件已实现,可看以下demo:

import { TreeController, TreeListener, TreeListenerManager, TreeListenType, NodeParam, TreeView, CallbackParam } from '[@kit](/user/kit).ArkUI'

[@Entry](/user/Entry)
[@Component](/user/Component)
struct TreeViewDemo {
 private treeController: TreeController = new TreeController();
 private treeListener: TreeListener = TreeListenerManager.getInstance().getTreeListener();
 [@State](/user/State) clickNodeId: number = 0;

 aboutToDisappear(): void {
   this.treeListener.off(TreeListenType.NODE_CLICK, undefined);
   this.treeListener.off(TreeListenType.NODE_ADD, undefined);
   this.treeListener.off(TreeListenType.NODE_DELETE, undefined);
   this.treeListener.off(TreeListenType.NODE_MOVE, undefined);
 }

 [@Builder](/user/Builder) menuBuilder1() {
   Flex({ direction: FlexDirection.Column, justifyContent: FlexAlign.Center, alignItems: ItemAlign.Center }) {
     Text('新增').fontSize(16).width(100).height(30).textAlign(TextAlign.Center)
       .onClick((event: ClickEvent) => {
         this.treeController.addNode();
       })
     Divider()
     Text('删除').fontSize(16).width(100).height(30).textAlign(TextAlign.Center)
       .onClick((event: ClickEvent) => {
         this.treeController.removeNode();
       })
     Divider()
     Text('重命名').fontSize(16).width(100).height(30).textAlign(TextAlign.Center)
       .onClick((event: ClickEvent) => {
         this.treeController.modifyNode();
       })
   }.width(100).border({width: 1, color: 0x80808a, radius: '16dp'})
 }

 aboutToAppear(): void {
   this.treeListener.on(TreeListenType.NODE_CLICK, (callbackParam: CallbackParam) => {
     this.clickNodeId = callbackParam.currentNodeId;
   })
   this.treeListener.on(TreeListenType.NODE_ADD, (callbackParam: CallbackParam) => {
     this.clickNodeId = callbackParam.currentNodeId;
   })
   this.treeListener.on(TreeListenType.NODE_DELETE, (callbackParam: CallbackParam) => {
     this.clickNodeId = callbackParam.currentNodeId;
   })
   this.treeListener.once(TreeListenType.NODE_MOVE, (callbackParam: CallbackParam) => {
     this.clickNodeId = callbackParam.currentNodeId;
   })

   let normalResource: Resource = $r('app.media.ic_public_collect_normal');
   let selectedResource: Resource = $r('app.media.ic_public_collect_selected');
   let editResource: Resource = $r('app.media.ic_public_collect_edit');
   let nodeParam: NodeParam = { parentNodeId:-1, currentNodeId: 1, isFolder: true, icon: normalResource, selectedIcon: selectedResource,
     editIcon: editResource, primaryTitle: "目录1验证悬浮框自适应效果是否OK",
     secondaryTitle: "6" };
   this.treeController
     .addNode(nodeParam)
     .addNode({parentNodeId:1, currentNodeId: 2, isFolder: false, primaryTitle: "项目1_1" })
     .addNode({ parentNodeId:-1, currentNodeId: 7, isFolder: true, primaryTitle: "目录2" })
     .addNode({ parentNodeId:-1, currentNodeId: 23, isFolder: true, icon: normalResource, selectedIcon: selectedResource,
       editIcon: editResource, primaryTitle: "目录3" })
     .addNode({ parentNodeId:-1, currentNodeId: 24, isFolder: false, primaryTitle: "项目4" })
     .addNode({ parentNodeId:-1, currentNodeId: 31, isFolder: true, icon: normalResource, selectedIcon: selectedResource,
       editIcon: editResource, primaryTitle: "目录5", secondaryTitle: "0" })
     .addNode({ parentNodeId:-1, currentNodeId: 32, isFolder: true, icon: normalResource, selectedIcon: selectedResource,
       editIcon: editResource, primaryTitle: "目录6", secondaryTitle: "0" })
     .addNode({ parentNodeId:32, currentNodeId: 35, isFolder: true, icon: normalResource, selectedIcon: selectedResource,
       editIcon: editResource, primaryTitle: "目录6-1", secondaryTitle: "0" })
     .addNode({ parentNodeId:-1, currentNodeId: 33, isFolder: true, icon: normalResource, selectedIcon: selectedResource,
       editIcon: editResource, primaryTitle: "目录7", secondaryTitle: "0" })
     .addNode({ parentNodeId:33, currentNodeId: 34, isFolder: false, primaryTitle: "项目8" })
     .addNode({ parentNodeId:-1, currentNodeId: 36, isFolder: false, primaryTitle: "项目9" })
     .buildDone();
   this.treeController.refreshNode(-1, "父节点", "子节点");
 }

 build() {
   Column(){
     SideBarContainer(SideBarContainerType.Embed)
     {
       TreeView({ treeController: this.treeController })
       Row() {
         Divider().vertical(true).strokeWidth(2).color(0x000000).lineCap(LineCapStyle.Round)
         Column({ space: 30 }) {
           Text('ClickNodeId=' + this.clickNodeId).fontSize('16fp')
           Button('Add', { type: ButtonType.Normal, stateEffect: true })
             .borderRadius(8).backgroundColor(0x317aff).width(90)
             .onClick((event: ClickEvent) => {
               this.treeController.addNode();
             })
           Button('Modify', { type: ButtonType.Normal, stateEffect: true })
             .borderRadius(8).backgroundColor(0x317aff).width(90)
             .onClick((event: ClickEvent) => {
               this.treeController.modifyNode();
             })
           Button('Remove', { type: ButtonType.Normal, stateEffect: true })
             .borderRadius(8).backgroundColor(0x317aff).width(120)
             .onClick((event: ClickEvent) => {
               this.treeController.removeNode();
             })
         }.height('100%').width('70%').alignItems(HorizontalAlign.Start).margin(10)
       }
     }
     .focusable(true)
     .showControlButton(false)
     .showSideBar(true)
   }
 }}

HarmonyOS 鸿蒙Next中的TreeView组件在ArkUI中用于展示树状结构的数据,并实现节点的展开和收起功能。以下是实现这一功能的关键点:

  1. 组件树结构:ArkUI框架通过布局组件和基础组件构建界面描述树(组件树),TreeView组件作为布局组件,用于构建具有层级关系的数据结构。
  2. 节点展开/收起:TreeView组件通过特定的属性和方法实现节点的展开和收起。这通常涉及到对节点状态的监听和响应,以及对应UI的更新。
  3. 自定义样式:开发者可以自定义TreeView组件中节点的样式,包括颜色、字体、图标等,以提升用户体验。

由于TreeView组件的具体实现细节可能随着HarmonyOS版本的更新而有所变化,建议参考最新的HarmonyOS开发者文档或示例代码来获取最准确的信息。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部