2017-08-22 48 views
1

我目前正在使用Tapestry 5.3,並使用樹組件來顯示具有4個級別的帳戶列表的層次結構。但現在我在這種情況下努力尋找搜索功能:具有搜索功能的TreeModelAdapter

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 

有人可以幫我這個邏輯的東西?謝謝。

回答

0

最後,我明白了。

我創建了一個新類AccountTreeModelAdapter這是執行TreeModelAdapter。您可以覆蓋getChildren方法並將搜索邏輯放在那裏。對我來說,工作在這個流程:

  • 添加setSearchedAccounts(List<Account> searchedAccounts)方法AccountTreeModelAdapter
  • 設置它從你的主類
  • 值在getChildren方法,使用Iterator遍歷你的整個列表(所有帳戶),並比較一個通過searchedAccounts列表中的每個帳戶的代碼(使用Java 8中的searchedAccounts.stream().filter())。

瞧,現在這棵樹只會顯示你想要的賬號。 但是,如何顯示父項?在此之前,樹會一次又一次地顯示父代和父代的父代以及父代的父代,直到您到達ROOT。

爲了達到這個目的,我在數據庫中爲我的Account實體創建了一個新列。這是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-

爲了讓每一個家長的ID,使用string.split(「 - 」)

所以,如果你想樹顯示父,你可以簡單地將父帳戶添加到searchedAccounts列表。

就是這樣。