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);
            }
        }
    }
}


关键是节点有两个问题


他们崩溃了吗?
它们可见吗?还是隐藏?


您可以忽略这种区别,但这将导致崩溃并总是使所有后代崩溃。这意味着您不能有一个具有未折叠子代的节点显示孙子代,折叠该节点,使该节点不折叠并看到那些孙子代处于与它们相同的折叠状态。 (我发现单击错误的节点并使在该节点下我仔细展开的所有内容都折叠起来特别烦人,因此我必须重做。)

然后,单击节点将需要切换折叠状态。


折叠的节点隐藏了所有后代,但仍可见。
未折叠的节点将隐藏其所有直接子节点。

如果未折叠这些直接子级,则应用规则,以显示未折叠节点的子级。因此,它们的直系子代(原始节点的孙代)未被隐藏,因此我们继续进行未隐藏的未隐藏节点。

10-07 23:38