2011-01-13 3 views
1

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

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

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

+0

ok Я обнаружил, что проблема не в селекторе. все, что я хочу, это список с двумя разными цветами для таких элементов, как приложение gmail, для чтения \ непрочитанных элементов. снова проблема заключается в том, что после того, как я установил фон в определенном элементе, селектор больше не отображается. Любая идея, как я могу изменить уровень apha на уровне выбора или нажать событие? – codeScriber

ответ

3

Найден ответ. Моя проблема заключается не в состоянии селектора, я хочу, чтобы селектор находился в том же состоянии для ВСЕХ предметов! проблема заключается в том, что я хочу, чтобы элемент был регулярным, если определенное логическое значение в элементах в адаптере является ложным и цвет 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> 

я узнал даже, хотя сам список является тот, который получает государство, оно передавать состояние на это дети (IE элементы списка), который, как я думал, этого не делал. Только андроид: сфокусированный не будет эффективен здесь, элементы списка 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

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

ОБНОВЛЕНИЕ

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

+0

Я просто объяснил, почему это не работает, когда вы устанавливаете фоном opf в представлении, создаваемом в getView(), вы создаете ситуацию, в которой этот элемент больше не будет нажат или выбран, поскольку селектор рисует себя под видом и рассчитывает, что фон представления будет прозрачным. Пожалуйста, прочитайте, прежде чем отвечать на очевидное. – codeScriber

+0

Упс, тогда я неправильно понял вас. Простите за это. – Flo

+0

no prob :-) u должен признать, что это хороший вопрос, хотя ;-) – codeScriber