para - manual de programacion android pdf
Obtener el elemento seleccionado de ListView vinculado con SimpleCursorAdapter (2)
De otra manera:
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
}
});
Soy nuevo en el desarrollo de Android ... proveniente de iPhone y fondo de .Net. He visto preguntas muy similares a esta, pero ninguna de ellas trata sobre SimpleCursorAdapter.
Tengo una ListActivity básica que usa un Cursor para vincular datos de una consulta 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 de 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.
Entonces, un par de puntos: después de buscar el cursor, desea llamar a 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á cerrada , el Cursor normalmente mantiene una conexión en vivo con el DB (por lo que el ListView puede desplazarse y hacer cosas de esa naturaleza que pueden requerir un acceso futuro al contenido del Cursor.
Para su pregunta central, la forma más fácil de hacerlo en onListItemClick
es esta:
Cursor c = ((SimpleCursorAdapter)l.getAdapter()).getCursor();
c.moveToPosition(position);
Luego puede usar c.getLong(0)
para obtener la identificación (suponiendo que haya obtenido la columna de identificación como la primera columna, que generalmente es el caso). Sin embargo, tenga en cuenta que el ID se transfiere como parte de la firma (consulte el último argumento en public void onListItemClick(ListView l, View v, int position, long id)
) para que realmente no necesite buscarlo nuevamente (pero ciertamente puedes si quieres quemar los ciclos). Para acceder a otras columnas puede hacer lo mismo, simplemente cambie el índice de la columna.
Espero que ayude.