web-dev-qa-db-fra.com

Arrière-plan d'éléments ListView via un sélecteur personnalisé

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!

97
shilgapira

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>
128
dgmltn

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:

  1. Définissez le sélecteur pour les éléments de la liste.
  2. Débarrassez-vous du sélecteur par défaut pour la liste.

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.

78
Michał K

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!

17
cV2

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

5
Scott D. Strader

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>
5
Cabezas

au lieu de:

Android:drawable="@color/transparent" 

écrire

Android:drawable="@Android:color/transparent"
4
Butters

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

4
pengwang

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é.

2
CommonsWare

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

2
Apperside