2011-05-27 21 views
36

Soy nuevo en el desarrollo de Android ... proveniente de iPhone y fondo .Net. He visto preguntas muy similares a esta, pero ninguna de ellas trata sobre SimpleCursorAdapter.Obtener el elemento seleccionado de ListView vinculado con SimpleCursorAdapter

Tengo un ListActivity básica que utiliza un cursor para enlazar datos desde una consulta de SQLite a mi ListView:

ListAdapter adapter = new SimpleCursorAdapter(
     this, 
     android.R.layout.simple_list_item_1, 
     c,   
     new String[] {"name"}, 
     new int[] {android.R.id.text1}); 

setListAdapter(adapter); 

Luego, cuando se hace clic en un elemento:

public void onListItemClick(ListView l, View v, int position, long id) { 

    super.onListItemClick(l, v, position, id); 

    //Difference between this: 
    Cursor c = (cursor)l.getItemAtPosition(position); 
    //and this?? 
    Cursor c = (Cursor)l.getAdapter().getItem(position); 

    int categoryId = c.getInt(0); 
} 

¿Es esta la forma correcta para obtener la identificación del elemento que se seleccionó? Parece extraño, porque no creo que pueda usar mi cursor después de que la base de datos esté cerrada (que es después de que se vincule). ¿Cuál es el objetivo de la identificación pasada, cuando parece que no puedo encontrar la manera de obtener el elemento real de esa identificación? Además, no entiendo por qué getItemAtPosition() devolvería un cursor ... el cursor está vinculado a toda la lista; no solo una fila Finalmente, si esto es correcto, ¿hay alguna diferencia entre las dos formas de obtener el cursor? Gracias.

Respuesta

81

Así que un par de puntos: después de buscar el cursor, desea llamar al startManagingCursor. Esto vincula el ciclo de vida del cursor con el ciclo de vida de la actividad (de modo que cuando se destruye la actividad, el cursor se cierra/se limpia).

startManagingCursor(c); 
ListAdapter adapter = new SimpleCursorAdapter(
     this, 
     android.R.layout.simple_list_item_1, 
     c,   
     new String[] {"name"}, 
     new int[] {android.R.id.text1}); 
setListAdapter(adapter); 

Además, la base de datos no está cerrado, el cursor normalmente mantiene una conexión en directo a la base de datos (por lo que el ListView puede desplazarse y hacer las cosas de esa naturaleza que pueda requerir el acceso futuro a los contenidos del cursor.

a su pregunta principal, la forma más fácil de hacerlo en onListItemClick es la siguiente:

Cursor c = ((SimpleCursorAdapter)l.getAdapter()).getCursor(); 
c.moveToPosition(position); 

a continuación, puede utilizar el c.getLong(0) obtener el ID (suponiendo que el que obtuvo el identificador de columna de una s la primera columna que generalmente es el caso). Sin embargo, tenga en cuenta que la identificación se transfiere como parte de la firma (vea el último argumento en public void onListItemClick(ListView l, View v, int position, long id)) por lo que realmente no necesita recuperarla nuevamente (pero ciertamente puede hacerlo si desea grabar los ciclos). Para acceder a otras columnas puede hacer lo mismo, simplemente cambie el índice de la columna.

Espero que ayude.

+0

Gracias! Estaba llamando a startManagingCursor, ¡pero no entendía por qué hasta ahora! Un par de preguntas ... ¿Así que incluso cuando llamo a SQLiteDatabase.close(), eso no impide que mi cursor acceda a él? Y ListView no parece tener un método getCursor(). Finalmente, la identificación que se pasa a mi método ES la identificación de mi base de datos automáticamente? ¡Gracias! – GendoIkari

+1

Ah, si llama 'close' entonces su ListView probablemente dejará de funcionar: generalmente lo que hago es reutilizar mi objeto Application como mi adaptador de base de datos: llamar abierto en' onCreate' y cerrar en 'onTerminate' y luego usar eso para empatar el ciclo de vida de la conexión de la base de datos al ciclo de vida de la aplicación. En cuanto al 'getCursor', mi error: debe ser' Cursor c = ((SimpleCursorAdapter) l.getAdapter()). GetCursor(); '. Y sí, la identificación es lo que sale de la base de datos: es bastante conveniente. – Femi

+0

¡Gracias de nuevo por su ayuda! – GendoIkari

0

Otra forma:

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 

     @Override 
     public void onItemClick(AdapterView<?> parent, View arg1, int position, long arg3) { 

      Cursor cursor = (Cursor) parent.getAdapter().getItem(position); 
      //TODO 
      } 
}); 
Cuestiones relacionadas