2012-03-21 29 views
5

Piszę prosty filtr w Androidzie i chcę użyć ExpandableListAdapter z polami wyboru.ExpandableListView i pola wyboru

Nie mam problemu z tworzeniem listy lub sprawdzaniem pola wyboru. ale naprawdę nie wiem, jak zapamiętać wybory. Po zamknięciu grupy i ponownym otwarciu lub gdy spróbuję otworzyć różne pola wyboru, są to zmiany.

Próbowałem czytać w Internecie na ten temat, ale nie znalazłem sposobu na rozwiązanie mojego problemu.

Oto mój kod:

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

jaki jest cel tej linii: Tasks.Status status [] = Tasks.Status.values ​​(); . Proszę podać mi rozwiązania –

+0

Mam podobny problem z polami wyboru w moim expandablelistview. Udało mi się znaleźć sposób na uratowanie wartości, ale komplikacje z niestałymi polami powstrzymywały mnie od posuwania się naprzód z rozwijanego widoku w moim projekcie. Proszę napisać kod lub odpowiedzieć, aby się skontaktować, ponieważ jestem bardzo zainteresowany, aby zobaczyć, w jaki sposób skontaktowałeś się z rozwiązaniem. – AlleyOOP

Odpowiedz

2

To zależy od tego ile chcesz go zaprojektować. Mapa> zadziała. Mapa zajmuje pozycję i daje zestaw sprawdzonych dzieci. Aby sprawdzić, czy dziecko jest sprawdzane, wywołaj Map.get() w grupie, a następnie sprawdź, czy zestaw zawiera identyfikator dziecka.

Jeśli chcesz sprawdzić, czy jest zaznaczone drugie dziecko z trzeciej grupy, można zrobić:

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

Aby ustawić dziecku sprawdzić:

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

ustawić dziecko odznaczone:

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

Musisz zainicjalizować mapę, aby zawierała puste zestawy dla każdej grupy, aby uniknąć NPE, ale to s łatwe do zrobienia, kiedy po raz pierwszy tworzysz mapę. Jestem pewien, że możesz wymyślić czystszy sposób na zrobienie tego, ale to proste i zadziała.

Powiązane problemy