2016-12-13 4 views
0

У меня есть ArrayAdapter для listView, который имеет флажок внутри. Когда значение флажка изменено, я хочу получить список элементов с отмеченными флажками.Android Получить дочерние элементы в listView

внутри onCreate функции для моей деятельности

ArrayAdapter<DrawerDetail> adapter = new ArrayAdapter<DrawerDetail>(this, R.layout.settings_minidrawer_item, apps) { 
    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     if(convertView == null){ 
      convertView = getLayoutInflater().inflate(R.layout.settings_minidrawer_item, null); 
     } 
     ImageView appIcon = (ImageView)convertView.findViewById(R.id.item_app_icon); 
     appIcon.setImageDrawable(apps.get(position).icon); 
     appIcon.setTag(apps.get(position).name); 
     TextView appLabel = (TextView)convertView.findViewById(R.id.item_app_name); 
     appLabel.setText(apps.get(position).label); 
     appLabel.setText(Integer.toString(position)); 
     CheckBox appCheck = (CheckBox)convertView.findViewById(R.id.item_app_check); 
     appCheck.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
      @Override 
      public void onCheckedChanged(CompoundButton buttonView,boolean isChecked) { 
       UpdatePreferences(); 
      } 
     }); 

     return convertView; 
    } 
}; 

list.setAdapter(adapter); 

updatePreferences

public void UpdatePreferences() { 
    SharedPreferences.Editor prefEditor = prefs.edit(); 

    SparseBooleanArray checked = list.getCheckedItemPositions(); 

    List<String> drawerListArray = new ArrayList<String>(); 
    View v; 
    CheckBox c; 
    for(int i = 0; i < list.getAdapter().getCount(); i++) { 
     v = list.getAdapter().getView(i, null, list); 
     c = (CheckBox) v.findViewById(R.id.item_app_check); 
     TextView aka = (TextView) v.findViewById(R.id.item_app_name); 
     aka.setText("dd"); 
     Log.e("checked: ", Boolean.toString(c.isChecked())); 
    } 
} 

если вы проверяете SparsBooleanArray checked значение, это всегда нуль. Также list.getAdapter().getView() похоже не работает.

эти строки не может найти вид (не возвращает ошибку, но не может получить/установить значение):

c = (CheckBox) v.findViewById(R.id.item_app_check); 
TextView aka = (TextView) v.findViewById(R.id.item_app_name); 

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

ответ

1

Не извлекайте эти виды. Передайте проверенную/непроверенную информацию в свой onCheckedChangeListener - например, Строка и информация, если она отмечена/не отмечена. Затем вы можете собирать отмеченные элементы в массиве.

Попробуйте сделать что-то вроде этого:

public class TestClass { 

    private List<String> checkedStrings = new ArrayList<>(); 

    ... 

    void updateArray(boolean checked, String checkedText){ 
     if(checked){ 
      if(!checkedStrings.contains(checkedText)){ 
       checkedStrings.add(checkedText); 
      } 
     } else { 
      checkedStrings.remove(checkedText); 
     } 
    } 
} 

И в вашем ArrayAdapter:

appCheck.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 
      @Override 
      public void onCheckedChanged(CompoundButton buttonView,boolean isChecked) { 
       updateArray(isChecked, apps.get(position).label); 
      } 
     }); 
+0

да, но в моем случае мне нужно, чтобы все проверенные значения были не только теми, которые я только что проверил. мой подход, кажется, является невосприимчивым. Я новичок в android – CBeTJlu4ok

+0

Да, я понимаю - вы можете создать массив в классе и поместить/удалить отмеченные/непроверенные элементы в этот массив в методе UpdatePreferences, когда вызывается onCheckedChange. Вы также хотите обновить соответствующую строку списка, например. изменить название? –

+0

нет только списка отмеченных флажков, но я должен иметь возможность установить тег из этого флажка. Что значит создать массив в классе? – CBeTJlu4ok

1

Пожалуйста, попробуйте заменить код:

c = (CheckBox) v.findViewById(R.id.item_app_check); 

с этим кодом:

View nextChild = null; 

// Find CheckBox inside the parent view 
for (int i = 0; i < ((ViewGroup) v).getChildCount(); ++i) { 
    nextChild = ((ViewGroup) v).getChildAt(i); 
    if (nextChild instanceof CheckBox) { 
     // Do your work; 

     break; 
    } 
} 
+0

Почему его нельзя найти напрямую? – CBeTJlu4ok

+1

Поскольку вы пытаетесь получить доступ к представлению, принадлежащему классу адаптера, из другого класса (TestClass в вашем случае). Поэтому, если вы пытаетесь получить доступ к нему из класса адаптера, вы просто назовете его, как и вы (по id). – AndroWeed

Смежные вопросы