другой цвет для определенного элемента в моем списке - PullRequest
1 голос
/ 13 января 2011

У меня есть список с элементами, некоторые элементы могут быть в состоянии просмотра. я хочу, чтобы у этих предметов был другой цвет фона, чем у остальных.

Представление списка в основном имеет один селектор для всего списка, установка цвета фона для одного из элементов не позволяет делать трюк, так как селектор отображается под макетом моего элемента в качестве фона и рассчитывает на то, что он прозрачен.

есть ли способ определить более одного селектора для списка? если нет, то возможно ли создать селектор с дополнительным состоянием? в основном все, что мне нужно, это обычный селектор списков плюс дополнительное состояние, что его ColorDrawable определено в моем colors.xml. (так как я не могу наследовать от drawable, и drawables list_selector android не видны в SDK для использования я хотел просто добавить состояние, но как мне применить принудительное использование дополнительного состояния?)

Ответы [ 2 ]

3 голосов
/ 31 января 2011

Нашел ответ. Моя проблема не в состоянии селектора, я хочу, чтобы селектор был в том же состоянии для ВСЕХ предметов! проблема в том, что я хочу, чтобы элемент был обычным, если определенное логическое значение в элементах в адаптере равно false, и цвет X, если логическое значение равно true, но даже если цвет равен X, я все же хочу, чтобы он был прозрачным после его выбора или нажатия.

Таким образом, решение заключается в следующем xml:

    <?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" 
          android:drawable="@android:color/transparent" /> <!-- pressed -->
    <item android:state_selected="true" 
          android:drawable="@android:color/transparent" /> <!-- focused -->
    <item android:drawable="@color/viewed_hotels_color" /> <!-- default -->
</selector>

Я обнаружил, что хотя сам список и получает состояние, он действительно передает это состояние своим дочерним элементам (т.е. элементам списка), которые, как я думал, он не делал. Только для Android: фокус здесь не будет эффективным, элементы списка Android не сфокусированы, а выделены ... так что, как вы можете видеть в любом состоянии, которое не нажато или выбрано, я даю свой цвет по умолчанию, в противном случае он прозрачен, и селектор виден всем .

в моем адаптере мне нужен следующий код (в методе getView ()):

View itemView = convertedView; <- i'll spare you the layout details...
Item item = getItem(position);
if( item.isViewed() ){
    itemView.setBackgroundResource(R.drawable.viewed_item_background);
}else{
    itemView.setBackgroundDrawable(null);
}

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

0 голосов
/ 13 января 2011

Вы можете реализовать пользовательский подкласс вашего Adapter и переопределить метод getView(). Поскольку этот метод вызывается списком для получения View для одного элемента, вы можете определить, как будет выглядеть отдельный элемент списка, переопределив getView(). Поэтому изменение цвета фона уже просматриваемого элемента не должно быть проблемой.

UPDATE

Класс AbsListView, который расширяет класс ListView, имеет метод, называемый setDrawSelectorOnTop(). Я думаю, что вы можете использовать его для управления поведением селектора.

...