2012-05-24 2 views
1

Я использую ExpandableListView, а дочерняя строка имеет текстовое представление и флажок в нем.Android: динамическая маркировка флажков в ExpandableListView

Что я хочу сделать, когда пользователь нажимает кнопку, действие определяет, какие элементы «проверяются» и что-то делают с этими элементами.

Я прочитал много сообщений о том, как ExpandableListView и флажки в настоящее время не работают, и как мне нужно сохранить дополнительную структуру данных, чтобы отслеживать, что было выбрано, а не. Этот пост охватывает этот вопрос: ExpandableListView and checkboxes

Done! Теперь я могу отслеживать, что было выбрано, и то, что не было выбрано.

Теперь я хочу решить проблему флажков, не отображающих их состояния. Я заметил, что флажки изменить случайным образом, когда:

  • поворот экрана меняется
  • группа коллапсирует/открывает

Я знаю, что это возможно, чтобы обнаружить эти события.

Я хочу знать, есть ли способ установить флажки вручную. Первоначально я пытался

ExpandableListView elv = getExpandableListView(); 
for(int i = 0; i < elv.getChildCount(); i++) { 
    CheckBox checkbox = ... somehow get checbox within the list 
    checkbox.setChecked(checkList.at(i, j)); 
} 

, где я и J указать, какую группу, и детей, и CheckList отслеживает проверяемых/непроверенных элементов.

Однако я заметил, что значение getChildCount() зависит от того, сколько групп открыто, и не обязательно сообщает мне, какой элемент списка я могу манипулировать.

РасширениеListView было использовано, и у кого-то должен был быть способ обойти эту проблему. Есть ли разумное решение? В частности, я ищу способы проверки/снятия соответствующих элементов в списке на onGroupExpand и onConfigurationChange (или аналогичных событиях).

Заранее благодарю вас!

+0

Вы хотите, чтобы нажать на сам флажок и изменить его состояние или нажмите на listitem (строка) и изменить его состояние? – Barak

+0

Я хочу проверить/снять флажки при каждом изменении вида или изменении списка. –

ответ

7

Проверьте следующий пример расширяемая адаптер

/** 
    * A simple adapter which maintains an ArrayList of photo resource Ids. 
    * Each photo is displayed as an image. This adapter supports clearing the 
    * list of photos and adding a new photo. 
    * 
    */ 
    public class MyExpandableListAdapter extends BaseExpandableListAdapter { 


     // Sample data set. children[i] contains the children (String[]) for groups[i]. 
     private String[] groups = { "People Names", "Dog Names", "Cat Names", "Fish Names" }; 
     private String[][] children = { 
       { "Arnold", "Barry", "Chuck", "David" }, 
       { "Ace", "Bandit", "Cha-Cha", "Deuce" }, 
       { "Fluffy", "Snuggles" }, 
       { "Goldy", "Bubbles" } 
     }; 

     private ArrayList<ArrayList<Boolean>> checkboxStatus = new ArrayList<ArrayList<Boolean>>(); 

     public MyExpandableListAdapter() { 
      int groupCount = groups.length; 
      for(int i=0; i<groupCount; i++) 
      { 
       int childCount = children[i].length; 
       ArrayList<Boolean> childStatus = new ArrayList<Boolean>(); 
       for(int j=0; j<childCount; j++) { 
        childStatus.add(false); 
       } 
       checkboxStatus.add(childStatus); 
      } 
     } 

     public Object getChild(int groupPosition, int childPosition) { 
      return children[groupPosition][childPosition]; 
     } 

     public long getChildId(int groupPosition, int childPosition) { 
      return childPosition; 
     } 

     public int getChildrenCount(int groupPosition) { 
      return children[groupPosition].length; 
     } 

     public TextView getGenericView() { 

      // Layout parameters for the ExpandableListView 
      AbsListView.LayoutParams lp = new AbsListView.LayoutParams(
        ViewGroup.LayoutParams.MATCH_PARENT, 64); 

      TextView textView = new TextView(ExpandableListCheckboxActivity.this); 
      textView.setLayoutParams(lp); 
      // Center the text vertically 
      textView.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT); 
      // Set the text starting position 
      textView.setPadding(36, 0, 0, 0); 
      return textView; 
     } 

     public View getChildView(int groupPosition, int childPosition, boolean isLastChild, 
       View convertView, ViewGroup parent) { 

      CheckBox chkbox = new CheckBox(ExpandableListCheckboxActivity.this); 
      chkbox.setTag("" + groupPosition + "," + childPosition); 
      chkbox.setOnCheckedChangeListener(checkboxListener); 
      chkbox.setText(children[groupPosition][childPosition]); 

      chkbox.setChecked(checkboxStatus.get(groupPosition).get(childPosition)); 

      return chkbox; 
     } 

     public Object getGroup(int groupPosition) { 
      return groups[groupPosition]; 
     } 

     public int getGroupCount() { 
      return groups.length; 
     } 

     public long getGroupId(int groupPosition) { 
      return groupPosition; 
     } 

     public View getGroupView(int groupPosition, boolean isExpanded, View convertView, 
       ViewGroup parent) { 
      TextView textView = getGenericView(); 
      textView.setText(getGroup(groupPosition).toString()); 

      return textView; 
     } 

     public boolean isChildSelectable(int groupPosition, int childPosition) { 
      return true; 
     } 

     public boolean hasStableIds() { 
      return true; 
     } 

     private OnCheckedChangeListener checkboxListener = new OnCheckedChangeListener() { 

      @Override 
      public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { 
       String positions = buttonView.getTag().toString(); 
       int groupPosition = Integer.valueOf(positions.split(",")[0]); 
       int childPosition = Integer.valueOf(positions.split(",")[1]); 
       checkboxStatus.get(groupPosition).set(childPosition, isChecked); 
      } 
     }; 

    } 
+0

Спасибо! Я попробую это. –

+0

@Kevin Adesara thanx ваш код помог мне ... – Harsh

+0

Могу ли я узнать, что такое «ExpandableListCheckboxActivity»? –

0

Если вы просто хотите, чтобы это изменить при нажатии на строку:

elv.setOnChildClickListener(new ExpandableListView.OnChildClickListener() { 
    @Override 
    public boolean onChildClick(ExpandableListView parent, View v, 
      int groupPosition, int childPosition, long id) { 
     CheckBox checkbox = (CheckBox) v.findViewById(r.id.yourcheckbox) 
     checkbox.setChecked(checkList.at(groupPosition, childPosition));  
     return true; 
    } 
}); 
+0

Благодарим вас за ответ. Я ищу что-то, что я могу запустить в onConfigurationChange (или onRotate ... нечто подобное) и onGroupExpand (из расширяемого списка), для всех дочерних элементов в списке. Тем не менее, я уже использую что-то подобное, чтобы отмечать/снимать флажки при выборе элементов. –

+0

Используете ли вы курсоры или массивы для возврата списка? – Barak

+0

Я использую массивы. –