57 votes

Pourquoi mon onItemSelectedListener n'est-il pas appelé dans une ListView ?

J'utilise un ListView qui est configuré de la manière suivante :

<ListView android:id="@android:id/list" android:layout_width="fill_parent"
    android:layout_height="fill_parent" android:longClickable="false"
    android:choiceMode="singleChoice">
</ListView>

Dans mon code, j'ajoute un OnItemSelectedListener à la ListView comme ceci :

getListView().setAdapter(adapter);
getListView().setOnItemSelectedListener(this);

mon activité implémente l'écouteur comme ça :

@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
    Log.d("Tag", "ListItemSelected: Parent: " + parent.toString() + " View: "
            + view.toString() + " Position: " + " Id: " + id);
}

J'espérais voir cette sortie de débogage au moment où je cliquerais sur un élément de la liste. Mais la sortie de débogage n'est jamais affichée dans LogCat.

108voto

Janusz Points 52607

El OnItemSelectedListener écoute les sélections d'éléments de liste et non les clics sur les éléments de liste.

Dans ce cas, une sélection pourrait être considérée comme un déplacement de la mise au point sur cet élément avec le pavé tactile de l'appareil.

Pour obtenir le comportement souhaité, il faut utiliser la fonction OnItemClickListener .

0 votes

J'ai appliqué votre méthode mais j'ai quelques problèmes. Le sélecteur de liste disparaît.

0 votes

Essayez d'ajouter ces attributs à votre vue de liste <ListView Android:stackFromBottom="true" Android:choiceMode="singleChoice" ... cela permettra de garder l'élément en surbrillance après l'avoir sélectionné, et lorsque vous sélectionnez un autre élément, la sélection précédente disparaîtra.

10 votes

Cela ressemble plus à une solution de contournement qu'à une réparation. Sélection ne se déclenche pas.

4voto

Edward Brey Points 8771

C'est parce que vous testez avec vos doigts sur un appareil tactile. Sur mode tactile il n'y a pas de concentration ni de sélection. Les interfaces utilisateur qui nécessitent une sélection doivent utiliser un autre type de widget, comme les boutons radio.

3voto

joe Points 299

Dans un premier temps, vous devez définir ChoiceMode ,et ensuite, dans le ListView, il n'acceptera pas l'événement sélectionné parce que setOnItemSelectedListener inscrit dans AdapterView ,et callback dans la méthode handleDataChanged() ,mais la classe AbsListView surchargez cette méthode et ne faites jamais de callback OnItemSelectedListener

enter image description here

vous pouvez obtenir le seletedItem par cette méthode en setOnItemClickListener

     mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            Log.e("TAG", "onItemClick: " + position);
            SparseBooleanArray positions = mListView.getCheckedItemPositions();
            Log.e("TAG", "onItemSelected: " + positions.toString());

        }
    });

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