tutorial studio desplegable custom columnas arrayadapter anidados android listview

android - studio - Fondo de elementos de ListView a través del selector personalizado



listview columnas android (10)

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

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


Es suficiente, si pones list_row_layout.xml :

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" android:gravity="center_vertical" android:background="@drawable/listitem_background">... </LinearLayout>

listitem_selector.xml:

<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:drawable="@color/dark" android:state_pressed="true" /> <item android:drawable="@color/dark" android:state_focused="true" /> <item android:drawable="@android:color/white" /> </selector>


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.


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:

<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android" > <item android:state_enabled="true" android:state_pressed="true" android:drawable="@drawable/list_item_bg_pressed" /> <item android:state_enabled="true" android:state_focused="true" android:drawable="@drawable/list_item_bg_focused" /> <item android:state_enabled="true" android:state_selected="true" android:drawable="@drawable/list_item_bg_focused" /> <item android:drawable="@drawable/list_item_bg_normal" /> </selector>

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):

<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:background="@drawable/row_selector" > ... </RelativeLayout>

Haga un selector transparente para la lista:

<ListView android:id="@+id/android:list" ... android:listSelector="@android:color/transparent" />

Esto debería hacer la cosa.


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:

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="?android:attr/listPreferredItemHeight" android:background="@drawable/listitem_background" > ... </LinearLayout>

listitem_background.xml:

<?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_selected="true" android:drawable="@color/android:transparent" /> <item android:drawable="@drawable/listitem_normal" /> </selector>

layout.xml que incluye el ListView:

... <ListView android:layout_width="fill_parent" android:layout_height="wrap_content" android:listSelector="@drawable/listitem_selector" /> ...

listitem_selector.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="@drawable/listitem_pressed" /> <item android:state_focused="true" android:drawable="@drawable/listitem_selected" /> </selector>


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.


Puedes escribir un tema:

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

theme.xml

<style name="Theme" parent="android:Theme"> <item name="android:listViewStyle">@style/MyListView</item> </style>

styles.xml

<style name="MyListView" parent="@android:style/Widget.ListView"> <item name="android:listSelector">@drawable/my_selector</item>

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


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

<item android:state_activated="true" android:color="@color/your_selected_color" /> <item android:state_pressed="true" android:color="@color/your_pressed_color" /> <item android:color="@color/your_normal_color"></item>

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

<item android:state_activated="true" android:color="@color/your_selected_textColor" /> <item android:state_pressed="true" android:color="@color/your_pressed_textColor" /> <item android:color="@color/your_normal_textColor"></item>

esto es una plantilla de fila de muestra

<ImageView android:id="@+skinMenu/lblIcon" android:layout_width="wrap_content" android:layout_height="wrap_content" android:gravity="center_horizontal" android:src="@drawable/menu_catalog" /> <TextView android:id="@+skinMenu/lblTitle" style="@style/superlabelStyle" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_marginLeft="20dp" android:gravity="center_vertical" android:text="test menu testo" android:textColor="@color/menu_textcolor_selector" android:textSize="20dp" android:textStyle="bold" />

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


en lugar de:

android:drawable="@color/transparent"

escribir

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


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!