簡體   English   中英

如何實現此遞歸算法以根據其父級在層次結構中的值來打開和關閉某些值

[英]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);
            }
        }
    }
}

關鍵是節點有兩個問題

  1. 他們崩潰了嗎?
  2. 它們可見嗎? 還是隱藏?

您可以忽略此區別,但這將導致崩潰始終折疊所有后代。 這意味着您不能擁有一個節點,其中包含未展開的子節點,顯示孫子節點,折疊節點,取消節點並查看處於相同崩潰狀態的孫子節點。 (我發現點擊錯誤的節點特別惱火,並且在節點崩潰后我小心地擴展了所有內容,所以我必須重做它。)

然后單擊節點將需要切換折疊狀態。

  • 折疊的節點會隱藏其所有后代,但仍然可見。
  • 未折疊的節點會將其所有直接子節點隱藏起來。
    • 如果這些直接子節點未折疊,則應用未折疊節點的子節點可見的規則。 因此,他們的直接孩子(原始節點的孫子)是未隱藏的,我們繼續關閉未隱藏的未隱藏節點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM