Фон элемента ListView не меняется - PullRequest
3 голосов
/ 02 июля 2011

У меня необычная проблема с моим ListView. В настоящее время у меня есть метод "deselectAll()", который перебирает элементы в моем ListView и устанавливает их непроверенными (элементы реализуют интерфейс Checkable). Переменная «флажок» изменяется правильно (представление отчетов не проверяется), но визуальный индикатор (в данном случае изменение фона) не отображает представление как непроверенный (фон остается цветом отмеченного элемента).

Я повторяю и отменяю выбор из своего списка, вот так (я также добавил свои отклонения):

private ListView vw_entryList;

private void deselectAll() {
    for (int i = 0; i < sAdapter.getCount(); i++) {
        ((Entry)vw_entryList.getItemAtPosition(i)).setChecked(false);
    }
}

Код для моего реализованного setChecked() выглядит следующим образом:

public void setChecked(boolean checked) {
    _checked = checked;
    if (checked) {
        setBackgroundResource(R.drawable.listview_checked);
    }
    else  {
        setBackgroundResource(R.drawable.listview_unchecked);
    }
    invalidate();
}

Следует отметить, что при нажатии элементов они переключаются между проверкой и снятием флажка в OnItemClickListener, и это работает нормально, с изменением фона и всем остальным. Код для переключения очень похож:

public void toggle() {
    _checked = !_checked;
    setBackgroundResource(_checked ? 
            R.drawable.listview_checked : R.drawable.listview_unchecked);
    invalidate();
}

Единственное отличие, которое я вижу, это то, откуда вызываются методы. toggle() вызывается из метода OnItemClickListener.onClick(), тогда как мой deselectAll() вызывается из стандартного OnClickListener кнопки, оба в одном классе. У кого-нибудь есть идеи относительно того, почему фон не меняется, когда я вызываю функцию deselectAll ()?

Ответы [ 2 ]

1 голос
/ 05 июля 2011

Попробовав все (спасибо за помощь, Ярек), я нашел решение, которое подходит для моих целей. Вместо того, чтобы неявно вызывать setChecked() в просмотренном виде, я оставляю его до метода setItemChecked() в классе ListView.

Мой обновленный код:

private void deselectAll() {        
    for (int i = 0; i < sAdapter.getCount(); i++) {
        vw_entryList.setItemChecked(i, false);
    }
}

Мое лучшее предположение заключается в том, что ListView знает, что его элементы реализуют класс Checkable, и поэтому требует, чтобы он сам являлся обработчиком всех операций с элементами. Что-то в этом роде. Если кто-то может объяснить более подробно, почему это решение работает, а другие нет, я вознагражу их ответом и ответом.

1 голос
/ 02 июля 2011

У вас есть нестандартный нестандартный цвет фона? Если это так, вы можете взглянуть на http://www.curious -creature.org / 2008/12/22 / почему мой черный список-андроид-оптимизация / - все сводится к настройке android: cacheColorHint атрибут вашего списка с цветом фона. Может быть, это поможет.

Отредактировано после дальнейшего обсуждения:

Я думаю, что вам нужно вызывать getAdapter (). NotifyDataSetChanged () в списке, а не инвалидом (). Список действительно построен так, как он полагается на адаптер для предоставления данных. То, что вы делаете, на самом деле у вас есть неявный адаптер - запись действительно сохраняется в адаптере, и, установив флажок, вы действительно изменяете модель данных, но если вы не вызываете notifyDataSetChanged (), список не знает, что модель изменился и не будет воссоздавать представления (invalidate () будет перерисовывать только существующие).

...