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
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);
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);
}
É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é.
Sur onItemClick :
String text = parent.getItemAtPosition(position).toString();
myList.setOnItemClickListener(new OnItemClickListener() {
public void onItemClick(AdapterView<?> adapter, View v, int position, long id) {
MyClass selItem = (MyClass) adapter.getItem(position);
}
}
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
}
});
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 .
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