2011-05-02 5 views
32

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

arg1.setBackgroundResource(R.drawable.highlighter); 

Ceci est le code utilisé par l'écouteur de clic pour mettre en surbrillance l'élément sélectionné. plz m'aide.

Mise à jour
J'installe 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]); 
+0

Si la réponse est acceptable, je peux accepter les données, mais si la réponse ne m'aide pas, comment puis-je accepter cela? –

+0

Si vous n'êtes pas satisfait des réponses, oubliez simplement la partie boost de mon précédent commentaire. Mais un peu plus d'information nous aiderait vraiment à comprendre où votre problème prend racine et comment vous aider. Je vous remercie! – rekaszeru

+0

J'utilise la mise en page relative.je suis en train de définir l'arrière-plan pour la vue liste en utilisant l'adaptateur, ma logique est que le rawnum est un impair donne une couleur d'arrière-plan et si le nombre pair donne une autre couleur d'arrière-plan. int [] colors = nouvel int [] {0xFFedf5ff, 0xFFFFFFFF}; \t public int colorPos; \t colorPos = position% couleurs.length; \t \t row.setBackgroundColor (couleurs [colorPos]); –

Répondre

105

ListViews par défaut n'ont pas choiceMode ensemble (il est réglé sur none), de sorte que la sélection en cours n'est pas indiqué visuellement. Pour changer cela, il vous suffit de définir l'attribut choiceMode de votre ListView sur singleChoice.
Si vous souhaitez personnaliser l'arrière-plan des éléments sélectionnés dans votre liste, vous devez également définir l'attribut listSelector. Là, vous pouvez spécifier non seulement les couleurs, mais les drawables (images, layer-/state-drawables).

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

Si vous n'utilisez pas ListView directement, mais un ListActivity, ces attributs doivent être configurés à partir du code, donc vous devez étendre onCreate votre activité méthode avec ces lignes:

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

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

Répondre à la mise à jour

Si vous définissez l'arrière-plan de votre méthode de getView, au lieu d'utiliser une couleur statique, appliquez une liste état étirables à l'arrière-plan de la ligne avec duplicateParentState définie sur true. De cette façon, il changera son affichage en fonction de l'état actuel de l'élément: normal, concentré, pressé, etc.

+0

J'ai essayé ce code, mais si je fais le listview choice_mode_single den le premier élément sélectionné est en surbrillance, mais si je sélectionne un autre élément, il n'est pas en surbrillance. –

+1

Y at-il une méthode ou une propriété pour obtenir l'élément sélectionné précédent dans la liste? –

+0

avez-vous supprimé le code dans lequel vous avez défini l'arrière-plan à l'aide d'un écouteur onitemclick? – rekaszeru

0

essayer à onListItemClick

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

Il met en évidence la sélection.

7

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"/> 

fond recalculée pour la racine de votre list_row.xml Android : background = "?Android: attr/activatedBackgroundIndicator "

20

Dans le xml listview ajouter le "mode"

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

Dans la mise en page de l'élément de liste ajouter

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

ex ample

<?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> 
+0

Pourquoi ce n'est pas la première chose qui arrive sur Google!? J'ai essayé pendant des heures pour que cela fonctionne. J'ai essayé toutes sortes d'états et de combinaisons d'états (sélectionnés, activés, focalisés, etc.) dans un sélecteur pouvant être dessiné avec 'android: listSelector =" @ drawable/theSelector "' set mais quand ça fonctionnait c'était buggy (l'indicateur de sélection en quelque sorte rester coincé pendant que je fais défiler la liste, même en restant entre deux éléments parfois). Cela a finalement fait fonctionner correctement. JE VOUS REMERCIE. –

Questions connexes