Как обновить неограниченное дочернее представление для ВСЕХ элементов в ListView? - PullRequest
0 голосов
/ 11 сентября 2011

У меня есть ListView, в котором используется пользовательский макет с 5 дочерними View объектами (4 TextView и 1 CheckBox) в пользовательском макете. Только TextViews связаны, однако - CheckBox не имеет соответствующего поля в базе данных. Цель CheckBox - просто определить, какие из отображаемых элементов я бы хотел обработать на «следующем шаге». Я использую пользовательский ViewBinder для правильного назначения текстовых значений (поскольку некоторые значения из БД являются датами и т. Д.).

Часть пользовательского интерфейса состоит из трех кнопок - «Все», «Нет» и «Инвертировать», которые я использую для переключения состояния каждого элемента в списке. Например, для кнопки «Все» я делаю это с помощью следующего кода (который, я теперь знаю, НЕ верен - я включил его, чтобы показать, что я пытаюсь сделать):

ListAdapter la = getListAdapter();
ListView lv = getListView();
int iCount = la.getCount();
for(int i=0; i<iCount; i++)
{
    View vv = lv.getChildAt(i);
    CheckBox cb = (CheckBox) vv.findViewById(R.id.ledgerItemCheckBox);
    cb.setChecked(true);
}

Это работает нормально, если количество элементов в списке не превышает размер списка, поэтому все элементы всегда видны. Однако когда я превышаю это число, функция 'getChildAt' иногда возвращает ноль, потому что (если я правильно понимаю) она не предназначена для возврата всех элементов в списке, только тех элементов, которые видны, что приводит к NullPointerException.

Как правильно установить CheckBox на всех видах, даже если они не видны?

1 Ответ

1 голос
/ 11 сентября 2011

Создайте псевдо-привязку к одному из ваших данных TextView, создайте ArrayList логических объектов в качестве внутреннего интерфейса для флажков. Обратите внимание, что ArrayList может быть не самой лучшей структурой данных для вашего приложения. Заполните ArrayList с булевыми значениями, установленными в начальное значение соответствующей позиции набора данных вашего курсора. Когда вы связываете, используйте ArrayList в качестве внутренних данных. Когда вы выбираете все, ни одного или инвертируете, обновите логические объекты в ArrayList, затем вызовите notifyDataSetChanged () в вашем SimpleCursorAdapter.

Добавление ах, другая половина проблемы, да, используйте onClickListener для CheckBoxes, но используйте тот же слушатель, не создавайте новый объект для каждого. Используйте метод getPositionForView () , чтобы получить вашу позицию и обновить базовые данные.

...