0

У меня есть ListView с CheckBox и TextView. Я пытаюсь найти CheckBox используя индекс. В моем текущем testcenario у меня есть 16 предметов в ListView. Следующий код работает до индекса 5 и после этого дает IllegalStateException. Почему это происходит? Как я могу получить CheckBox всех индексов? Я считаю, что это как-то связано с Layout, представляющим только видимые строки. Но даже когда я прокручиваю вниз, индекс 0 работает, а индексы больше 5 нет. ListView - это частный атрибут внутри класса. Код:Почему ListView getChildAt работает только до определенного индекса?

public void inform(View v) {    
      TextView tv; 
      CheckBox cb; 
      String s = ""; 
      int nrItems = lv.getCount(); 
      LinearLayout layout = (LinearLayout) lv.getChildAt(6); 
      Toast.makeText(getApplicationContext(), Integer.toString(layout.getChildCount()), Toast.LENGTH_SHORT).show(); 
      cb = (CheckBox) layout.getChildAt(0); 
      Toast.makeText(getApplicationContext(), Boolean.toString(cb.isChecked()), Toast.LENGTH_SHORT).show(); 
} 
+4

это работает только для объединенных просмотров – Blackbelt

+0

Как мне получить все индексы? –

ответ

2

На самом деле там видны только видимые виды. Если вы прокрутите вниз, так что вы видите строку 6 до 10, например, то getChildAt(0); фактически строка 6, потому что это первая точка зрения, что на самом деле там

EDIT:
То, что вы, вероятно, пытаются сделать это getten IsChecked() значения всех флажков. Дело в том, что на экране больше нет флажков, чем показано на экране. Таким образом, «все флажки» не всегда 16.

Флажок должен быть только представлением некоторых данных. Вы не должны полагаться на факт на isChecked, чтобы что-то сделать. Вы должны сохранить отдельный список или массив логических значений, которые отображают, установлен ли флажок. Это также полезно при повторном использовании строк, которые, как я полагаю, вы этого не делаете.

+0

Спасибо за краткое объяснение. Вы знаете, как получить все 'CheckBox'? –

+1

см. Мое редактирование для более подробного объяснения –

1

Используйте ListView со своим адаптером. Пример:

public class SampleAdapter extends BaseAdapter { 

List<Item> mData ; // Don't forget to instantiate this 



@Override 
public int getCount() { 
    return mData.size(); 
} 

@Override 
public Object getItem(int position) { 
    return mData.get(position); 
} 

public void setIsChecked(boolean isChecked){ 
    for(Item item : mData){ 
     item.isChecked = isChecked; 
    } 
    notifyDataSetChanged(); 
} 

@Override 
public long getItemId(int position) { 
    return 0; 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    //Some example. Create or inflate view here 
    if(convertView == null) 
     convertView = new CheckBox(parent.getContext()); 
    convertView.isChecked(mData.isChecked); 

    return convertView ; 
} 
} 

Обновлено

Пойнт вы должны изменить данные и не мнение непосредственно. После вызова notofyDataSetChanged() для адаптера все представления будут автоматически изменены.

+0

как вы можете синхронизировать значения флажка со списком в действии? –

+0

Спасибо. Но то, что я хотел сделать, это изменить список (сам список, а не список в адаптере), который автоматически присваивается адаптеру, когда я устанавливаю флажок в списке. –

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