Fondo de elementos de ListView a través del selector personalizado

¿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 para el caso state_focused="false" , pero cambiar esto a algún dibujante 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 funcione:

          

Y así es como estoy configurando el selector:

  

¡Gracias de antemano por cualquier ayuda!

Me he sentido frustrado y finalmente lo resolví. Como lo insinuó Romain Guy, hay otro estado, "android:state_selected" , que debes usar. Utilice un estado dibujable para el fondo de su elemento de lista y use un estado diferente listSelector para listSelector de su lista:

list_row_layout.xml:

   ...  

listitem_background.xml:

      

layout.xml que incluye el ListView:

 ...  ... 

listitem_selector.xml:

      

La solución de dglmtn no funciona cuando tienes un parche de 9 parches con relleno como fondo. Suceden cosas extrañas, ni siquiera quiero hablar de eso, si tienes un problema así, lo sabes.

Ahora, si quieres tener una vista de lista con diferentes estados y drawwables de 9 parches (podría funcionar con cualquier elemento dibujable y colores, creo) tienes que hacer 2 cosas:

  1. Establezca el selector para los elementos en la lista.
  2. Deshazte del selector predeterminado para la lista.

Lo que debe hacer primero es establecer row_selector.xml:

        

No olvides el android:state_selected . Funciona como android:state_focused para la lista, pero se aplica para el elemento de la lista.

Ahora aplique el selector a los elementos (row.xml):

   ...  

Haga un selector transparente para la lista:

  

Esto debería hacer la cosa.

Nunca use un “color de fondo” para sus filas de vista de lista …

esto bloqueará cada acción del selector (¡fue mi problema!)

¡buena suerte!

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 completa de por qué el fondo de la lista se vuelve negro al desplazarse. Respuesta simple: configure cacheColorHint en su lista como transparente (# 00000000).

Es suficiente, si pones list_row_layout.xml :

 ...  

listitem_selector.xml:

       

en lugar de:

 android:drawable="@color/transparent" 

escribir

 android:drawable="@android:color/transparent" 

Puedes escribir un tema:

 
 android:name=".List10" android:theme="@style/Theme"

theme.xml

  

styles.xml

   

my_selector es tu quieres un selector personalizado. Lo siento, no sé cómo escribir mi código.

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, puedes tener control sobre los cambios de selección y dibujar lo que quieras. En este proyecto de muestra , hago que el selector sea transparente y dibuje una barra en el elemento seleccionado.

Siempre uso el mismo método y funciona siempre, en todas partes: simplemente uso un selector como este

    

y configurar el ListView (ESTO ES MUY IMPORTANTE PARA HACER FUNCIONAR) el atributo

 android:choiceMode="singleChoice" 

para el textColor simplemente ponga en la carpeta de color (IMPORTANTE, ¡carpeta no dibujable!) un selector como este

    

esto es una plantilla de fila de muestra

   

todo el trabajo showld sin tediosas soluciones. espero que esto ayude

FrostWire Team aquí.

Toda la API de selector de errores no funciona como se esperaba. Después de probar todas las soluciones presentadas en este hilo para nada bueno, simplemente resolvimos el problema al momento de inflar el elemento ListView.

  1. Asegúrate de que tu artículo mantenga su estado, lo hicimos como una variable miembro del MenuItem (booleano seleccionado)

  2. Cuando se infle, pregunte si el elemento subyacente está seleccionado, de ser 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 que invoque notifyDataChanged () cuando se haya seleccionado algo.

      @Override public View getView(int position, View convertView, ViewGroup parent) { View rowView = convertView; if (rowView == null) { LayoutInflater inflater = act.getLayoutInflater(); rowView = inflater.inflate(R.layout.slidemenu_listitem, null); MenuItemHolder viewHolder = new MenuItemHolder(); viewHolder.label = (TextView) rowView.findViewById(R.id.slidemenu_item_label); viewHolder.icon = (ImageView) rowView.findViewById(R.id.slidemenu_item_icon); rowView.setTag(viewHolder); } MenuItemHolder holder = (MenuItemHolder) rowView.getTag(); String s = items[position].label; holder.label.setText(s); holder.icon.setImageDrawable(items[position].icon); //Here comes the magic rowView.setSelected(items[position].selected); rowView.setBackgroundResource((rowView.isSelected()) ? R.drawable.slidemenu_item_background_selected : R.drawable.slidemenu_item_background); return rowView; } 

Sería realmente agradable si los selectores realmente funcionaran, en teoría es una solución agradable y elegante, pero parece que está rota. BESO.