web-dev-qa-db-fra.com

Changer la sélection dans un ListView de Orange en Vert

Comment puis-je faire cela par élément de liste sélectionné.

J'ai essayé d'ajouter ceci à Android:background

<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <item Android:state_focused="true" 
        Android:state_pressed="false"
        Android:drawable="@color/Android_green" />
    <item Android:state_focused="true" 
        Android:state_pressed="true"
        Android:drawable="@color/black_alpha" />
    <item Android:state_focused="false" 
        Android:state_pressed="true"
        Android:drawable="@color/black_alpha" />
    <item Android:drawable="@color/white_alpha" />
</selector> 

mais cela ne fonctionne pas, cela change tout le ListView.


Ne fonctionne toujours pas, voici ce que j'ai jusqu'à présent

:: listview_background

<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <item Android:state_focused="true" Android:drawable="@color/black_alpha" />
    <item Android:drawable="@color/white_alpha" />  
</selector> 

:: Mon avis utilisant ce qui précède

<ListView Android:id="@+id/list" Android:layout_width="fill_parent"
    Android:layout_height="fill_parent" Android:layout_below="@+id/round"
    Android:listSelector="@drawable/listview_background">
</ListView>

Le problème est que black_alpha appliquera la liste entière, pas seulement l'élément de liste sélectionné

22
jax

Voici un bon article sur l'utilisation des sélecteurs avec des listes.

Au lieu de le définir comme étant le Android:background de ListView, je pense que vous souhaitez définir Android:listSelector comme indiqué ci-dessous:

<ListView Android:id="@+id/list" 
      Android:layout_width="fill_parent"
      Android:layout_height="wrap_content" 
      Android:layout_gravity="center"
      Android:divider="@null" 
      Android:dividerHeight="0dip"
      Android:listSelector="@drawable/list_selector" />
21
Jay Askren

Jax, vous avez dit que:

Le problème est que black_alpha appliquera la liste entière, pas seulement l'élément de liste sélectionné

J'ai eu le même problème. Après avoir joué avec elle pendant un certain temps, j'ai pu faire en sorte qu'elle cesse d'appliquer la couleur à toute la liste en utilisant une image 3x3 png de la couleur que je voulais au lieu d'appliquer une couleur. Donc, pour une raison étrange, si vous utilisez une couleur, vous obtenez un comportement étrange en arrière-plan. Lorsque vous utilisez un png, cela fonctionne bien. : S

C'est donc une façon de contourner le problème.

-----Autrement----------

J'ai trouvé les meilleurs résultats en réglant le sélecteur listView sur aucun état comme celui-ci:

res/drawable/list_selector.xml

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
</selector>

Ensuite, je m'occupe de tous les états à l'arrière-plan de l'élément de la liste. PAS dans le sélecteur. J'ai trouvé que j'avais plus de contrôle de cette façon.

res/color/list_item_bg.xml

<?xml version="1.0" encoding="utf-8"?>
   <selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
<item Android:state_selected="false"
    Android:state_pressed="false" 
    Android:drawable="@color/list_item_black_translucent" />
<item Android:state_pressed="true" 
    Android:drawable="@color/light_green_accent_translucent" />
</selector>

Alors voici mon article de liste:

res/layout/simple_list_item.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="wrap_content"
Android:orientation="horizontal"
Android:paddingRight="45dip"
Android:paddingBottom="2dip"
Android:layout_gravity="center_vertical"
Android:background="@color/list_item_bg">
  <ImageView
    Android:id="@+id/arrow"
    Android:layout_width="wrap_content"
    Android:layout_height="wrap_content"
    Android:layout_marginRight="8dip"
    Android:src="@drawable/list_item_arrow" />
 <TextView
Android:id="@+id/simple_list_item_label"
Android:layout_width="fill_parent"
Android:layout_height="wrap_content"
Android:gravity="center_vertical"
Android:textSize="12sp"
Android:textColor="@color/list_label_color"/>
</LinearLayout>
8
b-ryce

Je faisais également face à votre problème lorsque le changement de couleur s’applique à l’ensemble de la liste. 

Mais maintenant, cela fonctionne pour moi maintenant:

Ma page principale contenant la listview (j'ai remarqué que je n'ai pas appliqué le sélecteur de liste ici): 

 <ListView 
    Android:id="@+id/controlList" Android:layout_width="wrap_content" Android:layout_height="wrap_content"/>

Au lieu d’appliquer le listselector à getView, il ressemble à tell cette ligne particulière (convertView) d’utiliser le listselector.xml en mode pliable pouvant être tiré lorsque son état change, par exemple pressé, concentré ...:

@Override
        public View getView(int position, View convertView, ViewGroup parent) {
            ViewHolder viewHolder;
            if(convertView == null){
                LayoutInflater li = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
                convertView = li.inflate(R.layout.control_list, null);
                viewHolder = new ViewHolder();

                viewHolder.topText = (TextView) convertView.findViewById(R.id.toptext);
                viewHolder.bottomText = (TextView) convertView.findViewById(R.id.bottomtext);
                convertView.setTag(viewHolder);

            }
            else{
                viewHolder = (ViewHolder) convertView.getTag();
            }


                    //each convertView will be assigned the listselector
            convertView.setBackgroundResource(R.drawable.listselector);


            viewHolder.topText.setText(testSchemes[position]);

            //viewHolder.vText.setText(testDetails[position]);
            return convertView;
        }

Et enfin mon listselector.xml:

<?xml version="1.0" encoding="utf-8"?>

<selector xmlns:Android="http://schemas.Android.com/apk/res/Android">
    <item Android:state_pressed="false"
        Android:state_selected="false"
        Android:drawable="@color/lightgreen" />

    <!-- 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_pressed="true" 

        Android:drawable="@color/darkgreen" />

    <item Android:state_selected="true" Android:state_pressed="false"
        Android:drawable="@color/orange" />



</selector>

C’est ce que fait le code ci-dessus: Toutes les entrées lors du premier chargement sont vert clair . Faire défiler de haut en bas à l’aide du curseur permet de mettre l’entrée sélectionnée en orange .

3
Bkteo

Comme Bigstones l'a mentionné dans un commentaire, une solution efficace consiste à utiliser une forme au lieu d'une couleur (la liste entière était également mise en surbrillance). Voici une solution complète:

ajoutez ces 2 attributs à la listview:

Android:drawSelectorOnTop="true"
Android:listSelector="@drawable/my_list_selector"

ajoutez my_list_selector.xml au dossier pouvant être dessiné:

<?xml version="1.0" encoding="UTF-8"?> 
<shape xmlns:Android="http://schemas.Android.com/apk/res/Android" Android:shape="rectangle"> 
    <solid Android:color="#77526F35"/>
</shape>

Les éléments de la liste doivent maintenant afficher une superposition verte semi-transparente à l'état pressé.

2
Ixx

J'ai fait face au même problème et il me fallait alors une simple ligne dans ma vue d'article XML.

    Android:background="?android:attr/activatedBackgroundIndicator"

Check this post: Ce post pourrait aider 

0
Joan P.S