2011-01-29 53 views
17

en mi aplicación para Android que han creado un componente ListView llamada miLista, y lo llenó con objetos de mi propio tipo personalizado:¿Cómo obtener el elemento seleccionado de ListView?

class MyClass{ 

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

} 

he utilizado la ArrayAdapter para delimitar las theObjects ArrayList con miLista:

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

Esto funciona bien, la lista está llena y etc., pero cuando intento acceder al elemento seleccionado, recibo un objeto nulo. He hecho esto 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 

} 

¿Cuál parece ser el problema? Gracias

Respuesta

-2

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

Nunca instanciaste tu clase.

+3

Él dijo que puede ver las cosas, por lo que la clase debe haber creado una instancia. – xandy

19

Está implementando el controlador de clic en lugar de Seleccionar controlador. Una lista por defecto no supone tener selección.

Lo que debe cambiar, en su ejemplo anterior, es

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

De manera predeterminada, cuando se hace clic en un elemento ListView no cambia su estado a "seleccionado". Así que, cuando se activa el evento y lo hace:

myList.getSelectedItem(); 

El método no tiene nada que devolver. Lo que tienes que hacer es utilizar la posición y obtener el objeto subyacente haciendo:

myList.getItemAtPosition(position); 
+1

¿Cómo ayuda eso a encontrar un índice de un artículo seleccionado?¿Cómo conseguirías el puesto en primer lugar? – Zelphir

+0

@Zelphir La posición se pasa al método onItemClick (adaptador AdapterView , vista v, posición int, identificación larga) – RustyFluff

+0

La respuesta correcta debería ser la aceptada – Michael

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

En onItemClick:

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

En touch mode, no hay un enfoque y ninguna selección . Su IU debe usar un tipo diferente de widget, como botones de opción, para seleccionar.

La documentación en ListView sobre esto es terrible, solo una mención oscura en setSelection.

4

Dado que el onItemClickLitener() mismo le proporcionará el índice del artículo seleccionado, puede simplemente hacer un getItemAtPosition(i).toString(). El fragmento de código es el siguiente: -

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

En el método anterior, el parámetro i en realidad le da la posición del elemento seleccionado.

1

Usando setOnItemClickListener es la respuesta correcta, pero si usted tiene un teclado que puede cambiar la selección incluso con flechas (sin clic se lleva a cabo), por lo que, es necesario implementar también 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 
      } 
     }); 
Cuestiones relacionadas