具有搜索功能的 TreeModelAdapter

TreeModelAdapter with Search Functionality

我目前正在使用 Tapestry 5.3,并使用树组件来显示具有 4 个级别的帐户列表的层次结构。但现在我正在为这种情况下的搜索功能而苦苦挣扎:

Level 1-1
|_ _ _ Level 2-1 
|_ _ _ Level 2-2
       |_ _ _ Level 3-1
       |_ _ _ Level 3-2
       |      |_ _ _ Level 4-1
       |      |_ _ _ Level 4-2
       |_ _ _ Level 3-3

例如。用户想要搜索帐户级别 4-1,树应该显示如下

Level 1-1
|_ _ _ Level 2-2
       |_ _ _ Level 3-2
              |_ _ _ Level 4-1

有人可以帮我解决这个逻辑问题吗?谢谢

终于想通了

我创建了一个新的 class AccountTreeModelAdapter,它是工具 TreeModelAdapter。您可以覆盖 getChildren 方法并将您的搜索逻辑放在那里。对我来说,它适用于这个流程:

  • AccountTreeModelAdapter
  • 中添加setSearchedAccounts(List<Account> searchedAccounts)方法
  • 从您的主 class
  • 中设置它的值
  • getChildren方法中,使用Iterator遍历整个列表(所有账户)并与searchedAccounts列表中的每个账户代码一一比较(使用searchedAccounts.stream().filter() 在 Java 8).

瞧,现在树将只显示您想要的帐户。 但是,如何显示parent?直到此时,树不显示 parent 和 parent 的 parent 和 parent 的 parent 一次又一次,直到你到达 ROOT .

为此,我在数据库中为我的帐户实体创建了一个新列。即 accountPath。所以每次用户创建一个帐户时,这个 accountPath 将像这样工作:

Account "ABC" (ID: 1)
    |_ _ _ "XYZ" (ID: 2)
        |_ _ _ "OPQ" (ID: 3)
            |_ _ _ "STU" (ID: 4)

帐户 "ABC" 将没有路径(因为它是 ROOT)。 帐户 "XYZ" 的路径为 -1- 帐户 "OPQ" 的路径为 -1-2- 帐户 "STU" 的路径为 -1-2-3-

要获取每个 parent 的 ID,请使用 string.split("-")

因此,如果您希望树显示 parent,您只需将 parent 帐户添加到 searchedAccounts 列表即可。

就这些了。