2012-03-21 34 views
5

Tôi đang viết bộ lọc đơn giản trong Android và muốn sử dụng ExpandableListAdapter bằng các hộp kiểm.ExpandableListView và hộp kiểm

Tôi không gặp vấn đề với việc tạo danh sách hoặc hộp kiểm kiểm tra. nhưng tôi thực sự không biết cách nhớ lựa chọn. Sau khi đóng nhóm và mở lại hoặc khi tôi cố gắng mở hộp kiểm nhóm khác nhau là những thay đổi.

Tôi đã cố gắng đọc trên mạng về điều đó nhưng tôi đã không tìm cách giải quyết vấn đề của mình.

Đây là mã của tôi:

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

mục đích của dòng này: Tasks.Status status [] = Tasks.Status.values ​​(); . Vui lòng cho tôi các giải pháp –

+0

Tôi gặp sự cố tương tự với hộp kiểm trong expandablelistview của mình. Tôi đã tìm ra một cách để lưu các giá trị, nhưng các biến chứng với các hộp kiểm đang bị thay đổi đã khiến tôi không thể chuyển tiếp từ expandablelistview trong dự án của mình. Vui lòng gửi mã hoặc trả lời để liên lạc, vì tôi rất quan tâm để xem cách bạn tiếp cận với một giải pháp. – AlleyOOP

Trả lời

2

Nó phụ thuộc vào số tiền bạn muốn thiết kế nó. Bản đồ> sẽ hoạt động. Bản đồ có một vị trí và cung cấp cho bạn một tập hợp các trẻ em được kiểm tra. Để xác định xem một đứa trẻ có được kiểm tra hay không, hãy gọi Map.get() trên nhóm, và sau đó xem nếu tập hợp chứa id của đứa trẻ.

Nếu bạn muốn xem nếu đứa con thứ hai của nhóm thứ ba được chọn, bạn có thể làm:

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

Để thiết lập một đứa trẻ kiểm tra:

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

Để thiết lập một đứa trẻ không được kiểm soát:

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

Bạn cần phải khởi tạo bản đồ để chứa các bộ trống cho mỗi nhóm để tránh NPE, nhưng s dễ dàng để làm khi bạn lần đầu tiên tạo bản đồ. Tôi chắc rằng bạn có thể đưa ra một cách sạch hơn để làm điều này, nhưng nó đơn giản và nó sẽ hoạt động.