web-dev-qa-db-fra.com

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

J'utilise un ListView configuré comme ceci:

<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 au ListView comme ceci:

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

mon activité implémente l'auditeur 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 que je verrais cette sortie de débogage au moment où je clique sur quelque chose dans la liste. Mais la sortie de débogage n'est jamais affichée dans LogCat.

56
Janusz

OnItemSelectedListener écoute les sélections d'élément de liste et non les clics d'élément de liste.

Dans ce cas, une sélection pourrait être considérée comme déplaçant le focus sur cet élément avec le trackpad de l'appareil.

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

98
Janusz

C'est parce que vous testez avec vos doigts sur un appareil tactile. En mode tactile , il n'y a ni mise au point ni sélection. Les interfaces utilisateur qui doivent être sélectionnées doivent utiliser un type de widget différent, comme des boutons radio.

3
Edward Brey

Dans un premier temps, vous devez définir ChoiceMode, puis, dans ListView, il n'acceptera pas l'événement sélectionné car setOnItemSelectedListener enregistré dans AdapterView et rappel dans la méthode handleDataChanged(), mais la classe AbsListView remplace cette méthode et ne rappelle jamais OnItemSelectedListener

enter image description here

vous pouvez obtenir le seletedItem par cette méthode dans 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());

        }
    });
2
joe