2012-03-21 4 views
5

Android에서 간단한 필터를 작성 중이며 ExpandableListAdapter에 확인란을 사용하고 싶습니다.확장형 목록보기 및 체크 박스

목록을 만들거나 확인란을 선택하는 데 아무런 문제가 없습니다. 그러나 나는 선택을 기억하는 법을 정말로 모른다. 그룹을 닫고 다시 열거 나 다른 그룹을 열려고 할 때 체크 박스가 변경됩니다.

그물에 대해 읽으려고했으나 문제를 해결하는 방법을 찾지 못했습니다.

여기 내 코드입니다 : 그것은 당신이 그것을 엔지니어링 할 정도에 따라 달라집니다

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 ​​(); . 제게 해결책을주세요. –

+0

내 expandablelistview의 체크 박스와 비슷한 문제가 있습니다. 값을 저장하는 방법을 알아 냈지만 변덕스러운 확인란의 복잡성으로 인해 프로젝트의 expandablelistview에서 앞으로 나아갈 수 없었습니다. 코드를 게시하거나 답변을 얻으십시오. 솔루션에 어떻게 접근했는지 알고 싶습니다. – AlleyOOP

답변

2

. 지도>가 작동합니다. Map은 위치를 취하고 체크 된 일련의 자식을 제공합니다. 하위가 선택되었는지 여부를 확인하려면 group에 대해 Map.get()을 호출 한 다음 집합에 하위의 ID가 포함되어 있는지 확인하십시오.

세 번째 그룹의 둘째 아이가 선택되어 있는지 확인하려면

, 당신은 할 수 :

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

을 확인 아이 설정하려면 :

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

이되지 않은 아이를 설정하려면를 :

NPE를 피하기 위해 모든 그룹에 대해 빈 세트를 포함하도록 맵을 초기화해야하지만 처음지도를 만들 때 쉽게 할 수 있습니다. 나는 이것을 할 수있는 더 깨끗한 방법을 생각해 낼 수있을 것이라고 확신하지만, 간단하고 효과적 일 것입니다.