3

階層に表示された親と子であるアイテムのリストがあります。expandedプロパティを切り替えたい。したがって、親がクリックされ、親の子が表示されている場合、すべての親の子が折りたたまれ、その逆も同様です。

Stackoverflow トレースはこの行を指しています

if (childItem.getItemId() == item.getItemId()) {
    hideItemAndDescendants(childItem); //causing stack overflow
  }

メソッドが自分自身を無限に呼び出し続けるとスタックオーバーフローが発生することを理解していますが、この場合、リストをループするだけのForループがitemsあり、リストのサイズは約10です。

public boolean toggleNodeCollapseState(long itemId) {
        boolean changed = false; // a flag to determine if anything collapsed or expanded
         for (int i = 0; i < items.size(); i++) {
            Item childItem = items.get(i);
            if (childItem.getParentItemId() == itemId) {
                changed = true;
                childItem.setCollapsed(!childItem.isCollapsed());

                if (childItem.isCollapsed()) {
                    hideItemAndDescendants(childItem);
                } else {
                    showDescendants(childItem);
                }

            }
         }
        return changed;
    }

    public void hideItemAndDescendants(Item item) {
        item.hide();
        for (int i = 0; i < items.size(); i++) {
            Item childItem = items.get(i);
            if (childItem.getItemId() == item.getItemId()) {
                  hideItemAndDescendants(childItem);
            }
        }
    }

    public void showDescendants(Item item) {
        item.hide();
        for (int i = 0; i < items.size(); i++) {
            Item childItem = items.get(i);
            if (childItem.getItemId() == item.getItemId()) {
                childItem.show();
                if (!childItem.isCollapsed()) {
                    showDescendants(childItem);
                }
            }
        }
    }
4

2 に答える 2

5

hideItemAndDecendants に再帰呼び出しがあります。

for (int i = 0; i < items.size(); i++) {
    Item childItem = items.get(i);
    if (childItem.getItemId() == item.getItemId()) {
          hideItemAndDescendants(childItem);
    }
}

それでまたchildItem.getItemId() == item.getItemId()電話hideItemAndDescendants(childItem);したら。これにより、無限ループが発生し、stackoverflowexception が発生する可能性があります。

于 2013-08-15T10:13:59.010 に答える
2

私の推測では、真のツリーではないデータ関係があると思います-たとえば

Item1
  |
  \- Item2
       |
       \- Item1

その時点で、それは永遠に再帰します。(または、より簡単に言えば、アイテムはそれ自体の子である可能性があります。)

これを診断する 1 つの方法はhideItemAndDescendants、"this" の識別子を出力するために、開始時に何らかの出力を書き込むことです。どこかでループが見られるはずです。

于 2013-08-15T10:12:57.260 に答える