2011-01-19 10 views
13

He leído varias preguntas relacionadas aquí en SO, además de consultar los documentos de Android y la fuente para tratar de resolver esto, pero estoy perplejo, aunque dado que el listSelector parece sólo para aplicar estilos en artículos seleccionados, no estoy en shock ...Android ListView Lista de estados que no muestra el fondo del elemento predeterminado

he definido en una Listview main.xml aquí:

<?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> 

el listSelector hace referencia es aquí (prestado en gran medida de la Lista de estado de Android predeterminada que se encuentra en el 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> 

Los dibujables hace referencia son formas, rectángulos redondeados, así:

<?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> 

Por lo tanto, el resultado final debe ser un ListView con elementos con un fondo @ estirable/shape_row por defecto, y luego diferentes fondos de colores dependiendo del estado. Cuando enciendo mi lista, todo funciona bien en términos de cuándo los estados están activos, como un elemento obtiene el foco, se presiona, etc., pero los elementos tienen un fondo transparente cuando no se selecciona ninguno (es decir, el estado de vista predeterminado). Tenía la esperanza de que la última regla de la Lista de Estado,

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

capturaría ese estado, pero por alguna razón no funciona. He cambiado las cosas y he probado diferentes configuraciones, y nada. Si edito el archivo row.xml que utilizo para definir los elementos de la lista en ListView y trato de agregar un android específico: fondo que apunta a @ drawable/shape_row, cada fila obtiene el fondo correcto, PERO al presionar, al enfocar, etc. los estados no se procesan (o al menos no se pueden ver porque el fondo nunca cambia).

¿Puede alguien señalarme en la dirección correcta aquí? Estoy tan cerca de poner esto en la cama, pero después de probar casi todo, simplemente no puedo hacer que los elementos de ListView tomen un fondo predeterminado Y respondo a la Lista de estado implementada a través de android: listSelector.

Gracias,

Paul

EDIT:

también acaba de intentar añadir android: itemBackground = "@ estirable/shape_row" al ListView en main.xml, y como era de esperar sin suerte (los documentos indica que debería usarse para especificar los fondos de los elementos del menú, pero pensó que valía la pena tomar una foto con los elementos de la lista).

Otra cosa probé, agregando android: visible = "true" a cada una de las definiciones del selector y del elemento. Los documentos StateListDrawable parecen indicar que "Provides initial visibility state of the drawable; the default value is false", pero agregar esto no cambió nada.

EDIT2: De acuerdo con la investigación realizada a continuación por Qberticus, parece que solo puede haber un conjunto de selectores de listas por vista, lo que confirma el comportamiento del selector de listas. También puedo confirmar que al configurar el android: drawSelectorOnTop mueve el selector EN FRENTE del elemento seleccionado, pero esto, por supuesto, oscurece el elemento de manera que solo veo el selector en sí (que en mi caso es una forma de color).

Esto es lo que la lista parece que con fondos conjunto:

normal, unselected list with background set

Debido a los antecedentes conjunto, no hay ningún cambio en su apariencia cuando se seleccionan los elementos. Si cambio el androide: Directiva drawSelectorOnTop true y seleccionar un elemento, me sale:

selected, with drawSelectorOnTop set to true

Y, por último, si fijo imagen sin fondo de los elementos de la lista, el selector funciona como se espera, pero por supuesto , no hay imágenes de fondo como la última regla de la StateSelector no parece ser seguido (¿no debería actuar como un cajón de sastre?) para los elementos no seleccionados es decir, no agradable costumbre formas redondeadas:

selected, no background

Entonces, mi problema permanece; si no configuro un fondo para cada elemento de la lista, puedo ver que el selector funciona, PERO los elementos no tienen fondo cuando no están seleccionados. Si configuro un fondo para el artículo, se ven geniales cuando no están seleccionados, pero el fondo oscurece el selector. ¿Simplemente no es posible tener un elemento de lista de forma única con selectores de trabajo?

Gracias por cualquier otra persona que puede pesar en

.

Respuesta

9

cuenta de esto, el problema fue que mientras yo estaba sentado el listSelector para el ListView a la lista del estado correctamente a través de android:listSelector="@drawable/list_selector", yo también tenía que establecer el fondo del elemento de lista a otra lista de Estado a través de android:background="@drawable/list_background"

En el list_background.lista del estado xml, que tengo:

<?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> 

encontrado la respuesta aquí:

Changing background color of ListView items on Android

En conjunción con mi lista de selección anterior, funciona perfectamente.

+0

Lamentablemente, sigo teniendo problemas para personalizar mi vista de lista. Publiqué mis problemas específicos aquí: http://stackoverflow.com/questions/5426385/listview-with-nine-patch-item-background-issues; Agradecería cualquier aporte que pueda tener. – LostNomad311

+1

Además, establezca el atributo de lista "cacheColorHint" en su color bg. De lo contrario, un deslizamiento rápido a través de su lista puede dar como resultado una lista de elementos negros. – larham1

2

El listSelector solamente se utiliza para especificar un View que se dibuja en el mismo lugar que el elemento seleccionado View. Es decir, solo hay una instancia del listSelector por ListView. Puede especificar si puede dibujar arriba o no usando drawSelectorOnTop.

Si desea que todas sus View s usen una lista de estados, debe especificar que se definan las secundarias View s.

estoy usando la fuente de AbsListView como referencia. Específicamente AbsListView#setSelector(Drawable), AbsListView#positionSelector, AbsListView#drawSelector y 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(); 
    } 
} 

La fuente indica que sólo hay una mSelector creado/utilizado y que se posiciona en el mismo rect delimitador como elemento seleccionado.

+0

¡Gracias por todo el trabajo! Cuando mencionas que listSelector solo se usa una vez por ListView, esto es lo que hago especificando en el XML de ListView. Configurar cada elemento de la Lista individual (son TextViews) para tener un fondo significa que listSelector se oculta ... sin fondo significa un fondo transparente para cada TextView hasta que el selector entre. Intenté usar la directiva drawSelectorOnTop para ListView, y trabajé en que puedo ver el selector sobre el fondo, pero también está en primer plano, oscureciendo también el contenido de TextView. –

+0

Tal vez simplemente no es posible tener un elemento ListView personalizado (en mi caso, redondeado) Y el comportamiento del selector adecuado ... tal vez necesito especificar un fondo para todo ListView, digamos un color, y luego los selectores se mostrarán correctamente . Esperaba haber redondeado los elementos de ListView Y la interacción del selector, pero tal vez simplemente no sea posible. –

0

Puede asignar un fondo predeterminado para el diseño de la raíz y selector_background para el elemento secundario, en este caso si el elemento no está seleccionado, el fondo predeterminado no oscurece el selector. Es trabajo para mi

Cuestiones relacionadas