[英]How can I implement this recursive algorithm to toggle some values on and off depending on their parent's value in a hierarchy
protected boolean toggleChildVisibility(long itemId) {
for (int i = 0; i < items.size(); i++) {
if (items.get(i).getParentItemId() == itemId) {
Item childItem = items.get(i);
childItem.setCollapsed(!childItem.isCollapsed());
toggleChildVisibility(childItem.getItemId());
}
}
}
我有一個項目列表,每個項目是子項目或父項目。 根父項的parentId等於0,子節點的parentId等於其父節點的id。
子項目也可以在它們下面有子項目。
我需要做這樣的事情。 如果我單擊其中一個項目,如果它們被展開,則需要所有其子項折疊,如果它們被折疊則展開。
除了一件事,我所使用的代碼。 假設我折疊了孩子的子項,然后我折疊了一個父母,他的孩子是我已經折疊的孩子之一。 然后那些孩子擴大了,但我不希望他們擴大,因為我剛剛試圖垮掉他們的更高的父母。
任何人都可以幫我修復它,以便當父母已經折疊時孩子們不會展開
public class Item {
long questionId;
int depth;
boolean collapsed,childrenCollapsed;
public boolean isChildrenCollapsed() {
return childrenCollapsed;
}
public void setChildrenCollapsed(boolean childrenCollapsed) {
this.childrenCollapsed = childrenCollapsed;
}
public boolean isCollapsed() {
return collapsed;
}
public void setCollapsed(boolean collapsed) {
this.collapsed = collapsed;
}
public long getDepth() {
return depth;
}
public void setDepth(int depth) {
this.depth = depth;
}
}
代碼不是獨立於其他級別切換每個級別的狀態,而是需要決定它是折疊還是擴展節點,然后將該決策傳遞給遞歸調用樹。
可能你想做這樣的事情:
public void toggleNodeCollapseState(int itemId) {
for (int i = 0; i < items.size(); i++) {
Item childItem = items.get(i);
if (childItem.getParentItemId() == itemId) {
childItem.setCollapsed(!childItem.isCollapsed);
if (childItem.isCollapsed) {
hideItemAndDescendants(childItem);
} else {
showDescendants(childItem);
}
}
}
}
public void hideItemAndDescendants(Item item) {
item.hide();
for (int i = 0; i < items.size(); i++) {
Item childItem = items.get(i);
if (childItem.getId() == item.getId()) {
hideItemAndDescendants(childItem);
}
}
}
public void showDescendants(Item item) {
item.hide();
for (int i = 0; i < items.size(); i++) {
Item childItem = items.get(i);
if (childItem.getId() == item.getId()) {
childItem.show();
if (!childItem.isCollapsed()) {
showDescendants(childItem);
}
}
}
}
關鍵是節點有兩個問題
您可以忽略此區別,但這將導致崩潰始終折疊所有后代。 這意味着您不能擁有一個節點,其中包含未展開的子節點,顯示孫子節點,折疊節點,取消節點並查看處於相同崩潰狀態的孫子節點。 (我發現點擊錯誤的節點特別惱火,並且在節點崩潰后我小心地擴展了所有內容,所以我必須重做它。)
然后單擊節點將需要切換折疊狀態。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.