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]);
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.
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>
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
Essayez ceci à onListItemClick
view.getFocusables(POSITION);
view.setSelected(true);
Il met en évidence la sélection.