Est-il possible d'appliquer un arrière-plan personnalisé à chaque élément de la liste à l'aide du sélecteur de liste?
Le sélecteur par défaut spécifie @Android:color/transparent
pour le state_focused="false"
cas, mais changer en un dessin personnalisable n’affecte pas les éléments qui ne sont pas sélectionnés. Romain Guy semble suggérer dans cette réponse que c'est possible.
J'obtiens actuellement le même effet en utilisant un arrière-plan personnalisé sur chaque vue et en le masquant lorsque l'élément est sélectionné/ciblé/quel que soit le mode de sélection du sélecteur, mais il serait plus élégant de le définir en un seul endroit.
Pour référence, c'est le sélecteur que j'utilise pour essayer de faire fonctionner ceci:
<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>
Et voici comment je règle le sélecteur:
<ListView
Android:id="@Android:id/list"
Android:layout_width="fill_parent"
Android:layout_height="fill_parent"
Android:listSelector="@drawable/list_selector_background" />
Merci d'avance pour votre aide!
J'ai moi-même été frustré par cette question et l'ai finalement résolu. Comme Romain Guy l'a laissé entendre, il y a un autre état, "Android:state_selected"
, que vous devez utiliser. Utilisez un état pouvant être dessiné pour l'arrière-plan de votre élément de liste et un autre état pouvant être dessiné pour listSelector
de votre liste:
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 qui inclut le 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>
La solution de dglmtn ne fonctionne pas si vous avez un correctif de 9 correctifs avec un rembourrage en arrière-plan. Des choses étranges se produisent, je ne veux même pas en parler, si vous avez un tel problème, vous les connaissez.
Maintenant, si vous voulez avoir une liste de vues avec différents états et 9 tirages (cela fonctionnerait avec n'importe quels tirables et couleurs, je pense), vous devez faire 2 choses:
Ce que vous devez faire est d’abord définir le paramètre 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>
N'oubliez pas le Android:state_selected
. Cela fonctionne comme Android:state_focused
pour la liste, mais s’applique à l’élément de la liste.
Appliquez maintenant le sélecteur aux éléments (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>
Crée un sélecteur transparent pour la liste:
<ListView
Android:id="@+id/Android:list"
...
Android:listSelector="@Android:color/transparent"
/>
Cela devrait faire la chose.
N'utilisez jamais une "couleur de fond" pour vos lignes listview ...
cela bloquera chaque action de sélecteur (c'était mon problème!)
bonne chance!
L'article "Pourquoi ma liste est-elle noire? Un Android optimisation" dans le Android Le blog des développeurs explique en détail pourquoi le Le fond de la liste devient noir lors du défilement Réponse simple: définissez cacheColorHint sur votre liste sur transparent (# 00000000).
C'est assez, si vous mettez 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>
au lieu de:
Android:drawable="@color/transparent"
écrire
Android:drawable="@Android:color/transparent"
Vous pouvez écrire un thème:
<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 est votre choix de sélecteur personnalisé Je suis désolé je ne sais pas comment écrire mon code
Je ne suis pas sûr de savoir comment obtenir l'effet souhaité avec le sélecteur lui-même - après tout, par définition, il existe un sélecteur pour toute la liste.
Cependant, vous pouvez contrôler les changements de sélection et dessiner ce que vous voulez. Dans cet exemple de projet , je rend le sélecteur transparent et trace une barre sur l'élément sélectionné.
J'utilise toujours la même méthode et ça marche à chaque fois, partout: j'utilise simplement un sélecteur comme celui-ci
<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>
et définir sur le ListView (THIS IS TRÈS IMPORTANT POUR LE FAIRE FONCTIONNER)) l'attribut
Android:choiceMode="singleChoice"
pour le textColor il suffit de mettre dans le dossier color (un dossier IMPORTANT, non dessinable!) un sélecteur comme celui-ci
<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>
ceci un exemple de modèle de ligne
<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" />
tout se passe sans travail fastidieux. espérons que cette aide