2016-04-30 16 views
0

ツリーファイル階層を表すクラスを作成しました。主なタスク - ファイルとフォルダをマークする機能(チェックボックスを使用)。このような問題に直面しました:アクションの以下の配列を有する親ディレクトリのチェックマークを消える:Android:ツリー内の親ノードのチェックボックスをオフにする方法

0)に移動します)

1(未確認1つのディレクトリを残す)ファイルをチェックし、ルートディレクトリに移動します未確認のディレクトリとすべてのファイル(またはそれ以上)を確認してください

2)より高いレベルに戻り、ディレクトリのチェックを外し、より高いレベルへの操作(1)

リターンを行い、あなたがいることが表示されますします親ディレクトリのチェックマークはチェックされていません(ルートディレクトリに少なくとも1つのチェックされたファイルがあります)。

多くの日、私は問題を探しています。たぶん誰かがエラーに気付くでしょう。前もって感謝します。

スクリーンショット:

Bug

Normal state

クラス:

public class FileTree { 
    /* The name for pointer to the parent node */ 
    public static final String PARENT_DIR = ".."; 

    private String mName; 
    private boolean mIsLeaf; 
    private boolean mIsChecked = false; 
    private long mSize; 
    /* Number of checked children */ 
    private int childrenCheckNum = 0; 
    private FileTree mParent; 
    private Map<String, FileTree> mChildren = new LinkedHashMap<String, FileTree>(); 

    public FileTree(String name, long size, int type) 
    { 
     this(name, size, type, null); 
    } 

    public FileTree(String name, long size, int type, FileTree parent) 
    { 
     mName = name; 
     mIsLeaf = type == FileNode.Type.FILE; 
     mParent = parent; 
     mSize = size; 
    } 

    public void addChild(FileTree node) 
    { 
     if (!mChildren.containsKey(node.getName())) { 
      mChildren.put(node.getName(), node); 
      mSize += node.size(); 
      if (mParent != null) { 
       mParent.onChildAdd(node.size()); 
      } 
     } 
    } 

    /* 
    * Sending new child size up the tree. 
    */ 

    private void onChildAdd(long size) 
    { 
     mSize += size; 
     if (mParent != null) { 
      mParent.onChildAdd(size); 
     } 
    } 

    public boolean findChild(String name) 
    { 
     if (mChildren.containsKey(name)) { 
      return true; 
     } 

     return false; 
    } 

    ... 

    public boolean isChecked() 
    { 
     return mIsChecked; 
    } 

    public void setCheck(boolean check) 
    { 
     mIsChecked = check; 

     /* Sending check change event up the parent */ 
     if (mParent != null && mParent.isChecked() != check) { 
      mParent.onChildCheckChange(check); 
     } 

     /* Sending check change event down the tree */ 
     if (getChildrenCount() != 0) { 
      childrenCheckNum = check ? getChildrenCount() : 0; 

      for (FileTree node : mChildren.values()) { 
       if (node.isChecked() != check) { 
        node.setCheck(check); 
       } 
      } 
     } 
    } 

    /* 
    * Sending check change events up the tree. 
    */ 

    private void onChildCheckChange(boolean check) 
    { 
     if (check) { 
      ++childrenCheckNum; 
      mIsChecked = true; 
     } else { 
      if (childrenCheckNum > 0) { 
       --childrenCheckNum; 
      } 

      /* Uncheck parent only if don't left selected children nodes */ 
      if (childrenCheckNum == 0) { 
       mIsChecked = false; 
      } 
     } 

     /* Sending check change event up the parent */ 
     if (mParent != null && mParent.isChecked() != check) { 
      mParent.onChildCheckChange(check); 
     } 
    } 
    ... 
} 

答えて

0

私はonChildCheckChanged簡素化しており、今では正常に

private synchronized void onChildCheckChange() 
    { 
     if (getChildrenCount() == 0) { 
      return; 
     } 

     long childrenCheckNum = 0; 
     for (FileTree child : children.values()) { 
      if (child.isChecked) { 
       ++childrenCheckNum; 
      } 
     } 

     /* Uncheck parent only if don't left selected children nodes */ 
     isChecked = childrenCheckNum > 0; 

     /* Sending check change event up the parent */ 
     if (parent != null && parent.isChecked() != isChecked) { 
      parent.onChildCheckChange(); 
     } 
    } 
を働いています
関連する問題