2012-03-21 94 views
5

我正在Android中編寫簡單的過濾器,並希望使用ExpandableListAdapter複選框。ExpandableListView和複選框

我沒有創建列表或檢查複選框的問題。但我真的不知道如何記住選擇。關閉組並重新打開後,或者當我嘗試打開不同的組時,複選框會發生更改。

我試圖在網上閱讀,但我沒有找到如何解決我的問題。

這裏是我的代碼:

public class TasksFilterDialog extends Dialog{ 

private static final String TAG = "Filter Dialog"; 
private static final String ChildID = "ChildID"; 
private static final String GroupID = "GroupID"; 

private boolean[] statusCheck; 

ExpandableListView list; 
SimpleExpandableListAdapter listAdapter; 

public TasksFilterDialog(Context context) { 
    super(context); 
    statusCheck = new boolean[Tasks.Status.values().length]; 
    for(int i=0; i<statusCheck.length; i++) 
     statusCheck[i]=true; 
} 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    Log.d(TAG, "Creating dialog"); 
    this.setContentView(R.layout.tasks_filter); 
    list = (ExpandableListView)findViewById(R.id.filter_list); 
    setListAdapter();      // Setting Adapter Values to use on list 
    list.setAdapter(listAdapter);   // Setting creating adapter to list 
    setOnChildClickListeners();   


    Log.d(TAG, "Creating dialog successfull"); 
} 


private void setListAdapter() { 
    Log.d(TAG, "Setting list adapter"); 
    listAdapter = new SimpleExpandableListAdapter(this.getContext(), 
      getGroups(), 
      R.layout.tasks_filter_groups_layout, 
      new String[] {GroupID}, 
      new int[] {R.id.filter_group_text}, 
      getChilds(), 
      R.layout.tasks_filter_simple_element, 
      new String[] {ChildID}, 
      new int[] {R.id.filter_simple_element_text}); 

    Log.d(TAG, "Setting list adapter successfull"); 
} 

private List<HashMap<String, String>> getGroups() { 
    Log.d(TAG, "Adding groups values"); 
    List<HashMap<String, String>> list = new ArrayList<HashMap<String, String>>(); 
    HashMap<String, String> statusMap = new HashMap<String, String>(); 
    statusMap.put(GroupID, "Status"); 
    list.add(statusMap); 
    HashMap<String, String> usersMap = new HashMap<String, String>(); 
    usersMap.put(GroupID, "Users"); 
    list.add(usersMap); 
    Log.d(TAG, "Adding groups values successfull"); 
    return list; 
} 

private List<List<HashMap<String, String>>> getChilds() { 
    Log.d(TAG, "Adding childs values"); 
    List<List<HashMap<String, String>>> list = new ArrayList<List<HashMap<String, String>>>(); 
    List<HashMap<String, String>> secList = new ArrayList<HashMap<String, String>>(); 
    HashMap<String, String> map; 
    Tasks.Status status[] = Tasks.Status.values(); 
    for(int i=0; i<status.length; i++) { 
     Log.d(TAG, "Adding child" + status[i].toString()); 
     map = new HashMap<String, String>(); 
     map.put(ChildID, status[i].toString()); 
     secList.add(map); 
    } 
    list.add(secList); 
    list.add(secList); 
    Log.d(TAG, "Adding childs values succesfull"); 
    return list; 
} 

private void setOnChildClickListeners() { 
    list.setOnChildClickListener(new OnChildClickListener() { 

     @Override 
     public boolean onChildClick(ExpandableListView list, View v, 
       int group, int id, long arg4) { 
      CheckBox cb = (CheckBox) v.findViewById(R.id.filter_simple_element_check); 
      cb.toggle(); 
      switch(group){ 
      case 0: 
       if(statusCheck[id]) 
        statusCheck[id]=false; 
       else 
        statusCheck[id]=true; 
       break; 
      case 1: 
       //TODO After getting Tasks function 

      } 
      return false; 
     } 

    }); 

} 

}

+0

此行的用途:Tasks.Status status [] = Tasks.Status.values(); 。請給我解決方案 – 2012-08-16 06:49:50

+0

我有我的expandablelistview中的複選框類似的問題。我已經想出了一種保存值的方法,但複選框變得複雜,使我無法從項目中的expandablelistview向前移動。請發佈代碼或回覆聯繫方式,因爲我非常有興趣瞭解您如何使用解決方案。 – AlleyOOP 2015-07-13 19:44:44

回答

2

這取決於你想要多少工程師吧。一個地圖>會起作用。地圖需要一個位置並給你一組檢查過的孩子。要確定孩子是否被選中,請調用組上的Map.get(),然後查看該集合是否包含孩子的ID。

如果你想看看第三組的第二個孩子被選中,你可以這樣做:

boolean isChecked = yourMap.get(3).contains(2); 

要設置一個孩子檢查:

yourMap.get(groupNum).add(childNum); 

要設置一個孩子選中:

yourMap.get(groupNum).remove(childNum); 

您需要初始化映射以包含每個組的空集以避免NPE,但是當你第一次創建地圖時很容易做到。我相信你可以想出一個更乾淨的方式來做到這一點,但它很簡單,它會工作。