2011-01-29 11 views
17

nella mia app Android ho creato un componente ListView chiamato myList, e riempito con oggetti della mia tipo personalizzato:Come ottenere l'oggetto selezionato da ListView?

class MyClass{ 

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

} 

ho usato l'ArrayAdapter per legava i theObjects ArrayList con myList:

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

Funziona bene, l'elenco è popolato e così via, ma quando sto cercando di accedere all'elemento selezionato, ricevo un oggetto Null. Ho fatto questo 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 

} 

Quale sembra essere il problema? Grazie

risposta

-2

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

Non hai mai istanziato la tua classe.

+3

Ha detto che può visualizzare la roba, quindi la classe deve aver istanziato. – xandy

19

Si sta implementando il gestore di clic anziché Select Handler. Un elenco di default non suppone di avere selezione.

Che cosa si dovrebbe cambiare, nel tuo esempio sopra, è quello di

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

Per impostazione predefinita, quando si fa clic su un elemento ListView non cambia il suo stato di "selezionato". Quindi, quando l'evento si attiva e lo fai:

myList.getSelectedItem(); 

Il metodo non ha nulla da restituire. Quello che devi fare è quello di utilizzare la posizione e ottenere l'oggetto sottostante facendo:

myList.getItemAtPosition(position); 
+1

In che modo ciò aiuta a trovare un indice di un articolo selezionato?Come otterresti la posizione in primo luogo? – Zelphir

+0

@Zelphir La posizione è passata nel metodo onItemClick (AdapterView , Visualizza v, int position, long id) – RustyFluff

+0

La risposta migliore, dovrebbe essere accettata – Michael

3
myList.setOnItemClickListener(new OnItemClickListener() { 
    public void onItemClick(AdapterView<?> adapter, View v, int position, long id) { 
     MyClass selItem = (MyClass) adapter.getItem(position); 
    } 
} 
5

Su onItemClick:

String text = parent.getItemAtPosition(position).toString(); 
1

In touch mode, non v'è alcuna 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 un'oscura menzione su setSelection.

4

Poiché lo onItemClickLitener() fornirà di per sé l'indice dell'elemento selezionato, è sufficiente eseguire uno getItemAtPosition(i).toString(). Il frammento 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 
     } 
    }); 

Sul metodo di cui sopra, il parametro i in realtà ti dà la posizione della voce selezionata.

1

Utilizzando setOnItemClickListener è la risposta corretta, ma se si dispone di una tastiera è possibile cambiare la selezione, anche con le frecce (non viene eseguita alcuna scatto), 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 
      } 
     }); 
Problemi correlati