Come ottenere l’object selezionato da ListView?

nella mia app per Android ho creato un componente ListView chiamato myList e lo ho riempito con oggetti del mio tipo personalizzato:

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

Ho usato l’ArrayAdapter per associare gli oggetti di ArrayList a myList:

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

Funziona bene, la lista è popolata e così via, ma quando sto cercando di accedere all’elemento selezionato, ricevo un object Null. L’ho fatto usando

 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 } 

Quello che sembra essere il problema? Grazie

Per impostazione predefinita, quando si fa clic su un object ListView, questo non cambia il suo stato in “selezionato”. Quindi, quando l’evento si triggers e lo fai:

 myList.getSelectedItem(); 

Il metodo non ha nulla da restituire. Quello che devi fare è usare la posizione e ottenere l’object sottostante facendo:

 myList.getItemAtPosition(position); 

Stai implementando il Click Handler piuttosto che Select Handler. Un elenco di default non suppone di avere selezione.

Quello che dovresti cambiare, nel tuo esempio sopra, è quello di

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

Poiché onItemClickLitener() fornisce di per sé l’indice dell’elemento selezionato, è sufficiente eseguire un getItemAtPosition(i).toString() . Lo snippet di codice è il seguente: –

  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 } }); 

Con il metodo sopra, il parametro i ti dà effettivamente la posizione dell’elemento selezionato.

Su 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); } } 

In modalità touch , non c’è messa a fuoco e nessuna selezione. L’interfaccia utente dovrebbe utilizzare un tipo diverso di widget, ad esempio i pulsanti di opzione, per la selezione.

La documentazione su ListView su questo è terribile, solo una citazione oscura su setSelection .

L’utilizzo di setOnItemClickListener è la risposta corretta, ma se si ha una tastiera è ansible modificare la selezione anche con le frecce (non viene eseguito alcun clic), quindi è necessario implementare anche 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 } }); 

MyClass selItem = (MyClass) myList.getSelectedItem (); //

Non hai mai istanziato la tua class.