2015-12-28 4 views
0

Я пытаюсь инициализировать checkbox listview из массива. Для этого я перебираю элементы списка и проверяю, существует ли элемент или нет, если это так, я установил его для проверки. Дело в том, что это не работает должным образом. Внутренне все работает отлично, массив результатов правильный, но визуально он не отображает флажки в правильном состоянии.CheckBox isCheked возвращает true, но визуально не проверяется

Это функция, которая инициализирует флажки, она вызывается методами onCreate и onResume.

public void init() 
{ 
    View v; 
    CheckBox checkbox; 
    for (int i = 0; i < LIST.getCount(); i++) { 
     v = LIST.getAdapter().getView(i, null, null); 
     checkbox = (CheckBox)v.findViewById(R.id.checkbox); 
     MyClass c = (MyClass) adapter.getItem(i); 
     if(List_to_compare.contains(c)) { 
      Log.i("Before", String.valueOf(checkbox.isChecked())); //returns false 
      checkbox.setChecked(true); 
      Log.i("After", String.valueOf(checkbox.isChecked())); //returns true 
     } 
    } 
} 

Но этот флажок не проверен визуально. Если требуется больше кода, сообщите мне, действительно борясь с этим.

+0

Вы можете добавить xml, чтобы проверить, хорошо ли установлен флажок. Код выглядит отлично – piotrek1543

ответ

1

То, что вы делаете, не будет работать.

Когда вы звоните getView() и изменяете представление, ListView не имеет понятия, что вы изменили этот вид. Сам ListView вызывает getView(), чтобы отобразить элементы списка, и он проигнорирует все, что вы сделали.

Вот как это исправить:

Вместо вызова getView(), вы будете переопределениеgetView() в адаптере и есть строки кода, такие как:

checkbox = (CheckBox)v.findViewById(R.id.checkbox); 
    MyClass c = (MyClass) getItem(position); 
    checkbox.setChecked(List_to_compare.contains(c)); 

Для дальнейшего использования, любое изменение a ListView элемент должен быть указан в модели элемента в адаптере до вызова notifyDataSetChanged(), а модель этого элемента должна использоваться в getView() для отображения текущего состояния.

+0

Спасибо за подробное объяснение kris, я знал, что мне нужно как-то уведомить список об изменении. Я до сих пор не понял, как решить мою проблему. Этот массив булевых объектов, о котором вы упоминаете, относится к моему массиву List_to_compare, так как те, которые его нет, не будут проверяться. – ruuux93

+0

Я думаю, все, что осталось сделать, чтобы заставить его работать, как вы предложили, реализовать метод setItemChecked, правильно? – ruuux93

+0

Таким образом, флажок появляется только для отображения? Ничего не меняется, если пользователь нажимает на него? Я просто предположил, что вы что-то сделали, когда был установлен флажок, и что для этого вы не указали код. –

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