2011-01-19 3 views
13

Прочитал ряд связанных вопросов здесь, в SO, а также просмотрел документы и источник Android, чтобы попытаться понять это, но я в тупике, хотя, учитывая, что listSelector, кажется, применяются только стили выбранных элементов, я не в шоке ...Список ListView List List, не отображающий фон элемента по умолчанию

у меня есть ListView определено в main.xml здесь:

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 
    <ListView 
    android:id="@android:id/list" 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:fadingEdgeLength="5dp" 
    android:divider="#000000" 
     android:dividerHeight="1dp" 
     android:listSelector="@drawable/list_selector" /> 
    <TextView 
    android:id="@android:id/empty" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:gravity="center" 
     android:singleLine="false" 
     android:text="@string/message_list_empty" /> 
</FrameLayout> 

listSelector ссылка здесь (заимствованы в основном из default State State List, найденный в SDK: /android/platforms/android-8/data/res/drawable/list_selector_background.xml):

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android"> 
    <!-- the window has lost focus, disable the items --> 
    <item 
     android:state_window_focused="false" 
     android:drawable="@drawable/shape_row_disabled" /> 

    <!-- the list items are disabled --> 
    <item 
     android:state_enabled="false" 
     android:state_focused="true" 
     android:state_pressed="true" 
     android:drawable="@drawable/shape_row_disabled" /> 
    <item 
     android:state_enabled="false" 
     android:state_focused="true" 
     android:drawable="@drawable/shape_row_disabled" /> 
    <item 
     android:state_enabled="false" 
     android:drawable="@drawable/shape_row_disabled" /> 

    <!-- the list items are enabled and being pressed --> 
    <item 
     android:state_focused="true" 
     android:state_pressed="true" 
     android:drawable="@drawable/shape_row_transition" /> 
    <item 
     android:state_focused="false" 
     android:state_pressed="true" 
     android:drawable="@drawable/shape_row_transition" /> 

    <!-- the list items are enabled and being used --> 
    <item 
     android:state_focused="true" 
     android:drawable="@drawable/shape_row_selected" /> 

    <!-- the default item --> 
    <item 
     android:drawable="@drawable/shape_row" /> 
</selector> 

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

<?xml version="1.0" encoding="utf-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android" 
android:shape="rectangle"> 
    <gradient 
     android:startColor="#EF6100" 
     android:centerColor="#FF8E00" 
     android:endColor="#EF6100" 
     android:angle="270" /> 
    <corners 
     android:bottomRightRadius="7dp" 
     android:bottomLeftRadius="7dp" 
     android:topLeftRadius="7dp" 
     android:topRightRadius="7dp" /> 
</shape> 

Таким образом, конечный результат должен быть ListView с элементами с @ вытяжке/shape_row фона по умолчанию, а затем разные цветные фоны в зависимости от состояния. Когда я запускаю свой список, все работает отлично, когда состояния активны, например, элемент получает фокус, нажат и т. Д., Но сами элементы имеют прозрачный фон, когда ни один не выбран (т. Е. Состояние представления по умолчанию). Я надеялся, что последнее правило Государственного списка,

<item android:drawable="@drawable/shape_row" /> 

бы захватить это состояние, но по какой-то причине он не работает. Я переместил вещи и попробовал разные настройки, и ничего. Если я отредактирую файл row.xml, который я использую для определения элементов списка в ListView и попытаюсь добавить конкретный андроид: фон, который указывает на @ drawable/shape_row, каждая строка получает правильный фон, НО при нажатии, в фокусе, и т. д. не могут обрабатываться (или, по крайней мере, не могут быть замечены, поскольку фон никогда не изменяется).

Может ли кто-нибудь указать мне правильное направление здесь? Я очень близок к тому, чтобы положить это на кровать, но, попробовав почти все, просто не могу заставить элементы ListView взять фон по умолчанию и ответить на реализованный список состояний через android: listSelector.

Спасибо,

Пол

EDIT:

Также просто попытался добавить Android: itemBackground = "@ вытяжке/shape_row" в ListView в main.xml, и неудивительно, что не повезло (документацию укажите, что он должен использоваться для указания фоновых элементов пунктов меню, но считал, что это стоит того, чтобы делать с элементами списка).

Другое дело, добавив android: visible = "true" к каждому из селекторов и определений элементов. Документы StateListDrawable, похоже, указывают, что "Provides initial visibility state of the drawable; the default value is false", но добавление этого ничего не изменило.

EDIT2: Итак, на основании исследований, проведенных ниже Qberticus, кажется, что может быть только один набор селекторов списков для каждого представления, что подтверждает поведение селектора списка. Я также могу подтвердить, что установка андроида: drawSelectorOnTop перемещает селектор IN FRONT выбранного элемента, но это, конечно, скрывает сам элемент, так что я вижу только селектор (который в моем случае является цветной фигурой).

Вот что список выглядит с фон набор:

normal, unselected list with background set

Благодаря множеству фона, нет никаких изменений по внешнему виду при выборе элементов. Если изменить андроид: drawSelectorOnTop директиву истинны и выбрать пункт, я получаю:

selected, with drawSelectorOnTop set to true

И, наконец, если я не устанавливал фоновое изображения для элементов списка, селектор работает, как ожидалось, но, конечно, , нет никаких фоновых изображений, как последнего правления StateSelector не появляется, чтобы следовать (она не должна выступать в качестве Catchall?) для невыбранных элементов, означающих не хороший обычай округлые формы:

selected, no background

Итак, моя проблема остается; если я не устанавливаю фон для каждого элемента списка, я вижу, как работает селектор, но элементы не имеют фона, если они не выбраны. Если я устанавливаю фон для элемента, они отлично смотрятся, когда они не выбраны, но фон скрывает селектор. Невозможно ли иметь элемент с уникальной формой с рабочими селекторами?

Спасибо за кого-то, кто может вес в.

ответ

9

Фигурные это, проблема в том, что в то время как я установка listSelector для ListView в Государственном реестре правильно через android:listSelector="@drawable/list_selector", я также необходимо установить фон для элемента списка в другой государственный список с помощью android:background="@drawable/list_background"

В list_background.XML состояние списка, у меня есть:

<?xml version="1.0" encoding="utf-8"?> 
<selector xmlns:android="http://schemas.android.com/apk/res/android" 
android:visible="true"> 

    <!-- the list items are disabled --> 
<item 
     android:state_window_focused="false" 
     android:drawable="@drawable/shape_row_disabled" /> 

    <!-- the list items are enabled, in focus but not being touched/pressed (idle) --> 
    <item 
     android:state_window_focused="true" 
     android:state_pressed="false" 
     android:state_focused="false" 
     android:state_selected="false" 
     android:drawable="@drawable/shape_row" /> 

    <!-- the catch-all --> 
    <item 
     android:drawable="@android:color/transparent" /> 
</selector> 

Найдено ответ здесь:

Changing background color of ListView items on Android

В сочетании с моим списком выбора выше, она прекрасно работает.

+0

К сожалению, у меня все еще возникают проблемы с настройкой моего списка. Я разместил здесь свои конкретные проблемы: http://stackoverflow.com/questions/5426385/listview-with-nine-patch-item-background-issues; Я был бы признателен за любые материалы, которые у вас есть. – LostNomad311

+1

Также установите атрибут списка "cacheColorHint" в свой цвет bg. В противном случае быстрый прокрутка по списку может привести к появлению списка черных элементов. – larham1

2

listSelector используется только для указания View, который будет нарисована в том же месте, что и элемент Viewвыбран. I.e, имеется только один экземпляр listSelector за ListView. Вы можете указать, может ли он нарисовать сверху или не использовать drawSelectorOnTop.

Если вы хотите, чтобы все ваши View s использовали список состояний, тогда вы должны указать, где определены дочерние элементы View.

Я использую источник для AbsListView в качестве ссылки. В частности AbsListView#setSelector(Drawable), AbsListView#positionSelector, AbsListView#drawSelector и AbsListView#dispatchDraw

AbsListView#drawSelector:

private void drawSelector(Canvas canvas) { 
     if (shouldShowSelector() && mSelectorRect != null && !mSelectorRect.isEmpty()) { 
      final Drawable selector = mSelector; 
      selector.setBounds(mSelectorRect); 
      selector.draw(canvas); 
     } 
} 

AbsListView#positionSelector:

void positionSelector(View sel) { 
    final Rect selectorRect = mSelectorRect; 
    selectorRect.set(sel.getLeft(), sel.getTop(), sel.getRight(), sel.getBottom()); 
    positionSelector(selectorRect.left, selectorRect.top, selectorRect.right, 
      selectorRect.bottom); 

    final boolean isChildViewEnabled = mIsChildViewEnabled; 
    if (sel.isEnabled() != isChildViewEnabled) { 
     mIsChildViewEnabled = !isChildViewEnabled; 
     refreshDrawableState(); 
    } 
} 

Источник указывает на то, что существует только одна mSelector создано/используется, и что он расположен в тот же ограничивающий прямоугольник, что и артикул.

+0

Спасибо за всю тяжелую работу! Когда вы указываете, что listSelector используется только один раз для ListView, это то, что я делаю, указывая его в XML ListView. Настройка каждого отдельного элемента списка (они являются TextViews), чтобы иметь фон, означает, что listSelector спрятан ... фон не означает прозрачный фон для каждого TextView до тех пор, пока селектор не начнет работать. Я попытался использовать директиву drawSelectorOnTop для ListView, и это работал над тем, что я вижу селектор над фоном, но он также находится на переднем плане, затеняя содержимое TextView. –

+0

Возможно, у вас нет возможности иметь пользовательский (в моем случае округленный) элемент ListView И правильное поведение селектора ... возможно, мне нужно указать фон для всего ListView, скажем, цвет, а затем селекторы будут отображаться правильно , Был надеется иметь округленные элементы ListView и селекторное взаимодействие, но, возможно, это просто невозможно. –

0

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

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