web-dev-qa-db-fra.com

mettant en surbrillance l'élément sélectionné dans la liste dans Android

Je vais avoir 1 vue de liste contactslist. J'ai écrit le code pour mettre en surbrillance l'élément sélectionné dans la variable ListView. Ça fonctionne. Lorsque je clique sur un élément, il le met en évidence, mais le problème est que si je clique sur un autre élément, il le met également en évidence. Je veux mettre en surbrillance l'élément sélectionné uniquement. La sélection précédente devra disparaître lorsque je clique sur un autre élément. 

arg1.setBackgroundResource(R.drawable.highlighter);

C'est le code dans l'écouteur de clic qui utilise pour mettre en surbrillance l'élément sélectionné. svp aidez-moi.

Mettre à jour
Je configure l'arrière-plan des lignes de l'adaptateur:

public int[] colors = new int[]{0xFFedf5ff, 0xFFFFFFFF}; 
public int colorPos; 

[...]
colorPos = position % colors.length; 
row.setBackgroundColor(colors[colorPos]);
36
andro-girl

ListViews Par défaut, aucun ensemble choiceMode (défini sur none) n'est défini, de sorte que la sélection actuelle n'est pas indiquée visuellement. 

Pour changer cela, il vous suffit de définir l'attribut choiceMode de votre ListView à singleChoice
Si vous souhaitez un arrière-plan personnalisé pour les éléments sélectionnés dans votre liste, vous devez également définir l'attribut listSelector. Vous pouvez y spécifier non seulement des couleurs, mais aussi des éléments dessinables (images, éléments dessinables en couches/états).

<ListView Android:id="@+id/my_list"
        Android:choiceMode="singleChoice" 
        Android:listSelector="@Android:color/darker_gray" />

Si vous n'utilisez pas une ListView directement, mais une ListActivity, ces attributs doivent être définis à partir du code. Vous devez donc étendre la méthode onCreate de votre activité avec les lignes suivantes:

getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE);
getListView().setSelector(Android.R.color.darker_gray);

Donc, si vous utilisiez un écouteur de clic pour changer l’arrière-plan de la ligne sélectionnée, supprimez-le de votre code et utilisez la méthode appropriée décrite ci-dessus.

Répondre à la mise à jour

Si vous définissez l'arrière-plan à partir de votre méthode getView, au lieu d'utiliser une couleur statique, appliquez une liste d'états pouvant être dessinée à l'arrière-plan de la ligne avec duplicateParentState défini sur true. De cette façon, il modifiera son affichage en fonction de l'état actuel de l'élément: normal, concentré, appuyé, etc.

110
rekaszeru

Dans listview xml, ajoutez le mode "singleChoice"

<ListView
    Android:layout_width="match_parent"
    Android:layout_height="wrap_content"
    Android:choiceMode="singleChoice"
    (...) >
</ListView>

Dans la disposition des éléments de la liste, ajoutez

Android: background = "? Android: attr/ActivéBackgroundIndicator

exemple

<?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:background="?android:attr/activatedBackgroundIndicator">

     <!-- your item content-->

</LinearLayout> 
24
Gonçalo Alberto

Une meilleure façon est dans votre thème, @ drawable/list_selector

list_selector.xml:

<!-- <item Android:drawable="@color/Android:transparent"  Android:state_selected="true" /> -->
<item Android:drawable="@color/list_bg" Android:state_selected="true"/>
<item Android:drawable="@color/list_bg" Android:state_activated="true"/>
<item Android:drawable="@color/transparent"/>

puis définissez l’arrière-plan pour la racine de votre liste_row.xml

8
subair_a

Essayez ceci à onListItemClick

view.getFocusables(POSITION);
view.setSelected(true);

Il met en évidence la sélection.

0
kanna