50 votes

Sélectionner par programme l'élément ListView dans Android

J'ai deux fragments. La première avec des boutons à l'intérieur, l'autre avec un ListView à l'intérieur (ListFragment).

J'aimerais que le premier fragment (grâce à ses boutons) pour permettre à l'utilisateur de parcourir la liste qui est dans le deuxième fragment.

Donc je veux la liste à être contrôlé par le premier fragment avec des boutons.

Je n'ai pas de problème de communication entre le fragment (envoi des commandes à partir du 1er fragment de la 2ème), mais je ne sais pas comment le dire à ma ListView pour sélectionner (par programmation) un particulier de l'élément de liste.

Quel genre de ListView dois-je utiliser et comment puis-je savoir la liste pour Sélectionner/mettre en Surbrillance/mise au point de l'un de ses éléments?

Je suis en mode tactile lorsque l'utilisateur appuie sur les touches de la 1ère fragment.

Dois-je utiliser setFocusableInTouchMode(true) ou setChoiceMode(ListView.CHOICE_MODE_SINGLE) ou quelque chose d'autre?

135voto

Jecimi Points 1416

C'est pour tout le monde essaie de :

-Sélectionnez par programmation d'un Élément dans une liste

-Faire de ce Point de rester en Surbrillance

Je suis en train de travailler sur Android ICS, je ne sais pas si cela fonctionne pour tous les niveaux de l'Api.

D'abord créer une listview (ou l'obtenir si vous êtes déjà dans une listActivity/listFragment)

Ensuite, définissez le mode de choix de votre listview unique avec :Mylistview.setChoiceMode(ListView.CHOICE_MODE_SINGLE);

Ensuite, sélectionnez par programmation, que votre article avec :Mylistview.setItemChecked(position, true); (position étant un entier indiquant le rang de l'élément pour le sélectionner)

Maintenant, votre question est sélectionnée, mais vous pourrait voir absolument rien, car il n'y a pas de retour visuel de la sélection. Maintenant, vous avez deux options : vous pouvez soit utiliser un préconstruit listview ou personnalisé de votre liste.

1) Si vous voulez un préconstruit listview, essayez de donner une d' simple_list_item_activated_1, simple_list_item_checked , simple_list_item_single_choice, etc...

Vous pouvez configurer votre listview comme ça pour l'e.g : setListAdapter(new ArrayAdapter<String>(this, R.layout.simple_list_item_activated_1, data))

à la suite de laquelle prêts à l'emploi listview choisi, vous verrez que quand vous avez sélectionné une case cochée ou le backgound changé de couleur , etc...

2) Si vous utilisez un personnalisé listview, alors vous allez définir une mise en page personnalisée qui sera utilisé dans chaque élément. Dans ce XML mise en page qui vous attribuera un sélecteur pour chaque partie de la vue en vous ligne qui ont besoin d'être changé lorsqu'il est sélectionné.

Disons que lorsque sélectionné, vous voulez que votre ligne pour modifier la couleur du texte et la couleur de l'arrière-plan. Votre XML mise en page peut être écrit comme :

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@drawable/menu_item_background_selector"
    android:orientation="horizontal" >

<TextView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:gravity="center_vertical"
    android:textColor="@drawable/menu_item_text_selector" />

Maintenant, dans le dossier drawable vous créez menu_item_background_selector.xml et menu_item_text_selector.xml.

menu_item_text_selector.xml :

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

<item android:state_activated="true"
     android:color="#FFF">
</item>

<item android:state_pressed="true"
     android:color="#FFF">
</item>

<item android:state_pressed="false"
     android:color="#000">
</item>

</selector>

Le texte est blanc lorsqu'il est sélectionné.

Puis faire la même chose pour votre arrière-plan: (n'oubliez pas que vous n'êtes pas obligé d'utiliser la couleur, mais vous pouvez également utiliser un drawable)

menu_item_background_selector.xml :

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


        <item android:state_activated="true"
        android:color="#0094CE">
        </item>

        <item android:state_pressed="true"
        android:color="#0094CE">
        </item>

        <item android:state_pressed="false"
        android:color="#ACD52B">
        </item>


      </selector>

Ici le fond est bleu lorsqu'il est sélectionné et vert quand il n'est pas sélectionné.

Le principal élément qui me manquait était android:state_activated. Il y a en effet de (trop) nombreux états : activé,pressé,concentré,vérifié,sélectionné...

Je ne sais pas si l'exemple que j'ai donné avec android:state_activated et android:state_pressed est la meilleure et la plus propre mais il semble fonctionner pour moi.

Mais je n'ai pas besoin de faire ma propre classe, de façon à obtenir un Personnalisé CheckableRelativeLayout (qui était sale et effrayant), ni que j'ai utilisé CheckableTextViews. Je ne sais pas whyothers utilisé de telles méthodes, il peut-être dépend de l'Api de niveau.

15voto

Essayez AbsListView.performItemClick (...)

Voir cet article sur comment utiliser performItemClick .

5voto

J_D Points 2225

Essayez mListView.setSelection(position);

0voto

asenovm Points 3149

Vous pouvez utiliser ListView#setSelection(int)

-1voto

zibetto Points 1

Ajoutez simplement la ligne suivante à la présentation de votre liste personnalisée:

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

Pour un exemple complet, voir:

https: //elimelec@bitbucket.org/elimelec/custombaseadapter.git

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