11 votes

Android : définir l'élément de la vue de liste comme "sélectionné" (mis en évidence)

Dans mon application je veux faire quelque chose de similaire à l'application gmail sur les tablettes, à gauche pour avoir la liste des éléments et à droite pour avoir un fragment avec le contenu de cet élément, comme pour l'application gmail ce contenu est téléchargé après sélection. Après avoir cliqué sur un élément, je veux qu'il reste en surbrillance jusqu'à ce que, bien sûr, je change la sélection. J'ai atteint un point où cela fonctionne mais seulement si je clique deux fois sur le même élément, donc la première fois que je clique, la sélection fonctionne et ensuite l'élément retourne à son état 'par défaut' et si je clique à nouveau dessus, le sélecteur (pour l'état sélectionné) est visible.

Voici ce que j'ai jusqu'à présent :

1) Le sélecteur (listitem_background.xml)

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

    <item android:drawable="@drawable/solid_white" android:state_pressed="false" android:state_selected="false"/>
    <item android:drawable="@drawable/listitem_pressed" android:state_pressed="true"/>
    <item android:drawable="@drawable/listitem_focused" android:state_selected="true"/>

</selector>

2) Pour la disposition linéaire supérieure de l'élément de liste :

android:background="@drawable/listitem_background"

(J'ai essayé de le définir comme sélecteur de liste, aussi)

3) Voici le ListView :

<ListView
    android:id="@+id/my_list_view"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:choiceMode="singleChoice"
    android:dividerHeight="1dp"
    android:drawSelectorOnTop="true"
    android:fadeScrollbars="true"
    android:fastScrollEnabled="true"
    android:focusable="true"
    android:focusableInTouchMode="true"
    android:scrollbarFadeDuration="100"
    android:scrollbars="vertical" />

4) Dans la partie code, j'ai essayé de jouer avec ça :

@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
    view.setSelected(true);
    ...
}

[EDIT] En fait, j'ai remarqué que la sélection est perdue après le commit du fragment dans la partie droite de l'écran. Si je ne committe pas le fragment, ça marche comme sur des roulettes... Je pense que j'ai besoin de quelque chose comme ça dans le sélecteur :

<item android:drawable="@drawable/listitem_focused" android:state_activated="true" android:state_focused="false"/>

Mais manifestement pas cette...

45voto

Ciprian Points 747

OK, j'ai enfin ma réponse.

L'idée est d'utiliser state_activated dans le sélecteur et

listView.setChoiceMode(ListView.CHOICE_MODE_SINGLE) 

dans le code, ou

android:choiceMode="singleChoice"

dans le xml, bien sûr

Voici à quoi devrait ressembler le sélecteur :

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

    <item android:drawable="@drawable/solid_white" android:state_activated="false"/>
    <item android:drawable="@drawable/solid_white" android:state_activated="false" android:state_pressed="false"/>
    <item android:drawable="@drawable/listitem_pressed" android:state_pressed="true"/>
    <item android:drawable="@drawable/listitem_focused" android:state_activated="true"/>

</selector>

Voici comment doit se présenter la mise en page des éléments de la liste :

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:background="@drawable/listitem_background"
    android:orientation="vertical" >
...
<LinearLayout/>

4voto

Joan P.S Points 265

J'ai été confronté au même problème et j'avais juste besoin d'une simple ligne dans mon xml de vue d'article.

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

Ce poste pourrait aider

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X