web-dev-qa-db-fra.com

Comment obtenir l'élément sélectionné de ListView?

dans mon application Android, j'ai créé un composant ListView appelé myList et je l'ai rempli d'objets de mon propre type personnalisé:

class MyClass{

    private String displayName;
    private String theValue;
... //here constructor, getters, setters and toString() are implemented

}

J'ai utilisé ArrayAdapter pour lier ArrayList theObjects avec myList:

ArrayAdapter<MyClass> adapter= 
                new ArrayAdapter<MyClass>(this, R.layout.lay_item, theObjects);
myList.setAdapter(adapter);

Cela fonctionne bien, la liste est remplie, etc., mais lorsque j'essaie d'accéder à l'élément sélectionné, je reçois un objet Null. J'ai fait cela en utilisant 

myList.setOnItemClickListener(new OnItemClickListener() {

   public void onItemClick(AdapterView<?> adapter, View v, int position, long id) {

MyClass selItem = (MyClass) myList.getSelectedItem(); //
String value= selItem.getTheValue(); //getter method

}

Quel semble être le problème? Je vous remercie

24
Bghaak

Par défaut, lorsque vous cliquez sur un élément ListView, son état n'est pas changé en "sélectionné". Alors, quand l'événement se déclenche et que vous le faites:

myList.getSelectedItem();

La méthode n'a rien à retourner. Ce que vous devez faire est d’utiliser la position et d’obtenir l’objet sous-jacent en faisant:

myList.getItemAtPosition(position);
42
DrTchock

Vous implémentez le Click Handler plutôt que le Select Handler. Une liste par défaut ne suppose pas de sélection. 

Ce que vous devriez changer, dans votre exemple ci-dessus, est de: 

public void onItemClick(AdapterView<?> adapter, View v, int position, long id) {
    MyClass item = (MyClass) adapter.getItem(position);
}
20
xandy

Étant donné que onItemClickLitener() vous fournira lui-même l'index de l'élément sélectionné, vous pouvez simplement effectuer un getItemAtPosition(i).toString(). L'extrait de code est donné ci-dessous: -

    listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {

            String s = listView.getItemAtPosition(i).toString();

            Toast.makeText(activity.getApplicationContext(), s, Toast.LENGTH_LONG).show();
            adapter.dismiss(); // If you want to close the adapter
        }
    });

Dans la méthode ci-dessus, le paramètre i vous donne en fait la position de l'élément sélectionné.

6
viper

Sur onItemClick :

String text = parent.getItemAtPosition(position).toString();
6
Boubakr
myList.setOnItemClickListener(new OnItemClickListener() {
  public void onItemClick(AdapterView<?> adapter, View v, int position, long id) {
      MyClass selItem = (MyClass) adapter.getItem(position);
   }
}
3
ngocquynh_183

Utiliser setOnItemClickListener est la bonne réponse, mais si vous avez un clavier, vous pouvez modifier la sélection même avec des flèches (aucun clic n'est effectué), vous devez donc également implémenter setOnItemSelectedListener:

myListView.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> adapterView, View view, int position, long l) {
     MyObject tmp=(MyObject) adapterView.getItemAtPosition(position);
         }
            @Override
            public void onNothingSelected(AdapterView<?> adapterView) {
                // your stuff
            }
        });
2
tecnocchio

En mode touch , il n'y a pas de mise au point ni de sélection. Votre interface utilisateur doit utiliser un type de widget différent, tel que des boutons radio, pour la sélection.

La documentation sur ListView à ce sujet est terrible, une seule mention obscure sur setSelection .

1
Edward Brey

Bien que j'utilisekotlin, le code suivant a répondu à votre question. Ce retour élément sélectionné:

val item = myListView.adapter.getItem(i).toString()

Ce qui suit est l'ensemble des éléments sélectionnés Listener

myListView.setOnItemClickListener(object : OnItemClickListener {
       override fun onItemClick(parent: AdapterView<*>, view: View, i: Int,
                        id: Long) {
           val item = myListView.adapter.getItem(i).toString()

       }
    })

Le code retourne l'élément cliqué par son index i, comme indiqué dans le code

0
defemz