¿Es posible aplicar un fondo personalizado a cada elemento de Listview a través del selector de lista?
El selector predeterminado especifica @android:color/transparent
el state_focused="false"
caso, pero cambiarlo a algún elemento de diseño personalizado no afecta a los elementos que no están seleccionados. Romain Guy parece sugerir en esta respuesta que esto es posible.
Actualmente estoy logrando el mismo efecto al usar un fondo personalizado en cada vista y ocultarlo cuando el elemento está seleccionado / enfocado / lo que sea para que se muestre el selector, pero sería más elegante tener todo esto definido en un solo lugar.
Como referencia, este es el selector que estoy usando para intentar que esto funcione:
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_focused="false"
android:drawable="@drawable/list_item_gradient" />
<!-- Even though these two point to the same resource, have two states so the drawable will invalidate itself when coming out of pressed state. -->
<item android:state_focused="true" android:state_enabled="false"
android:state_pressed="true"
android:drawable="@drawable/list_selector_background_disabled" />
<item android:state_focused="true" android:state_enabled="false"
android:drawable="@drawable/list_selector_background_disabled" />
<item android:state_focused="true" android:state_pressed="true"
android:drawable="@drawable/list_selector_background_transition" />
<item android:state_focused="false" android:state_pressed="true"
android:drawable="@drawable/list_selector_background_transition" />
<item android:state_focused="true"
android:drawable="@drawable/list_selector_background_focus" />
</selector>
Y así es como estoy configurando el selector:
<ListView
android:id="@android:id/list"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:listSelector="@drawable/list_selector_background" />
¡Gracias de antemano por cualquier ayuda!
La solución de dglmtn no funciona cuando tiene un dibujable de 9 parches con relleno como fondo. Suceden cosas raras, ni siquiera quiero hablar de eso, si tienes un problema así, los conoces.
Ahora, si desea tener una vista de lista con diferentes estados y elementos de diseño de 9 parches (creo que funcionaría con cualquier elemento de diseño y color), debe hacer 2 cosas:
Lo que debe hacer primero es configurar row_selector.xml:
No olvide el
android:state_selected
. Funciona comoandroid:state_focused
para la lista, pero se aplica para el elemento de la lista.Ahora aplique el selector a los elementos (row.xml):
Haz un selector transparente para la lista:
Esto debería hacer la cosa.
fuente
Nunca use un "color de fondo" para sus filas de vista de lista ...
esto bloqueará cada acción del selector (¡era mi problema!)
¡buena suerte!
fuente
setBackgroundColor
con un "color". Suspiro ... UsasetBackground
osetBackgroundDrawable
según tu versión de API con un selector.El artículo "¿Por qué mi lista es negra? Una optimización de Android" en el Blog de desarrolladores de Android tiene una explicación detallada de por qué el fondo de la lista se vuelve negro cuando se desplaza. Respuesta simple: configure cacheColorHint en su lista en transparente (# 00000000).
fuente
Es suficiente, si pones
list_row_layout.xml
:listitem_selector.xml:
fuente
en vez de:
escribir
fuente
Puedes escribir un tema:
theme.xml
styles.xml
my_selector es su selector de deseos personalizado Lo siento, no sé cómo escribir mi código
fuente
No estoy seguro de cómo lograr el efecto deseado a través del selector en sí; después de todo, por definición, hay un selector para toda la lista.
Sin embargo, puede controlar los cambios de selección y dibujar lo que quiera. En este proyecto de muestra , hago transparente el selector y dibujo una barra en el elemento seleccionado.
fuente
<item android:state_focused="false" android:drawable="@android:color/transparent" />
cláusula en el selector predeterminado.Siempre uso el mismo método y funciona siempre, en todas partes: simplemente uso un selector como este
y establezca en ListView (ESTO ES MUY IMPORTANTE PARA QUE FUNCIONE) el atributo
para el textColor simplemente coloque en la carpeta de color (¡IMPORTANTE, carpeta no dibujable!)
esta es una plantilla de fila de muestra
todo funcionaba sin tediosas soluciones. espero que esto ayude
fuente
Equipo de FrostWire aquí.
Toda la API de basura del selector no funciona como se esperaba. Después de probar todas las soluciones presentadas en este hilo en vano, simplemente resolvimos el problema en el momento de inflar el elemento ListView.
Asegúrese de que su artículo mantenga su estado, lo hicimos como una variable miembro de MenuItem (booleano seleccionado)
Cuando infle, pregunte si el elemento subyacente está seleccionado, si es así, simplemente configure el recurso dibujable que desea como fondo (ya sea un parche 9 o lo que sea). Asegúrese de que su adaptador sea consciente de esto y de que llame a notifyDataChanged () cuando se haya seleccionado algo.
Sería realmente bueno si los selectores realmente funcionaran, en teoría es una solución agradable y elegante, pero parece que está rota. BESO.
fuente