2011-04-16 20 views
9

¿Cómo se puede encontrar la posición de un elemento específico dentro de un ListView? (Completado por SimpleCursorAdapter).¿Obtiene la posición de un elemento dentro de un ListView?

La razón por la que pregunto: La vista de lista está configurada en el modo singleChoice. Cuando el usuario cierra y vuelve a abrir la aplicación, me gustaría que se recordara la selección del usuario.

La forma en que lo he hecho hasta ahora es cuando el usuario hace clic en un elemento, la ID del elemento elegido se guarda en las preferencias. Lo que necesito aprender es cómo volver a seleccionar el elemento en el método onCreate de la actividad una vez que se haya vuelto a llenar.

Mi código para guardar el ID del elemento seleccionado:

@Override 
protected void onListItemClick(ListView l, View v, int position, long id) { 
    super.onListItemClick(l, v, position, id); 

    Cursor c = (Cursor) l.getItemAtPosition(position); 
    selectedItem = c.getLong(c.getColumnIndex("_id")); 
} 

(he intentado buscando en Google, pero sólo parecen encontrar la manera de obtener la posición del elemento seleccionado)

Gracias!

Respuesta

15

Usted debe tratar

//SimpleCursorAdapter adapter; 
final int position = adapter.getCursor().getPosition(); 

API Docs:

public abstract int getPosition() 

desde: Nivel API 1

Devuelve la posición actual del cursor en la fila establecida. El valor es basado en cero. Cuando el conjunto de filas sea el primero devuelto, el cursor estará en la posición -1, que está antes de la primera fila. Después de que se devuelva la última fila, otra llamada al next() dejará el cursor después de la última entrada, en una posición de count().

devoluciones la posición actual del cursor.

Actualizar

Para obtener la posición de un elemento basado en la identificación usado por el adaptador:

private int getItemPositionByAdapterId(final long id) 
{ 
    for (int i = 0; i < adapter.getCount(); i++) 
    { 
     if (adapter.getItemId(i) == id) 
      return i; 
    } 
    return -1; 
} 

Para obtener la posición de un elemento basado en las propiedades del objeto subyacente (valores de los miembros)

//here i use `id`, which i assume is a member of a `MyObject` class, 
//and this class is used to represent the data of the items inside your list: 
private int getItemPositionByObjectId(final long id) 
{ 
    for (int i = 0; i < adapter.getCount(); i++) 
    { 
     if (((MyObject)adapter.getItem(i)).getId() == id) 
      return i; 
    } 
    return -1; 
} 
+0

¡Gracias! Pero ¿cómo buscaría la posición de un artículo, con una identificación? – Jodes

+0

(lo siento, espero no estar siendo demasiado densa!) – Jodes

+0

No se preocupe. ¿Quiere decir una identificación que es un miembro del objeto subyacente que representa, o la identificación utilizada por el adaptador (en caso de que no sean los mismos)? de todos modos, acabo de actualizar la respuesta, tal vez cubra lo que necesita – rekaszeru

1

Cuando dices, "... volver a seleccionar el elemento en el método onCreate de la actividad ...", ¿quieres decir que cuando el usuario re pasa a la actividad ListView, cualquier elemento que se eligió previamente, ahora se encuentra actualmente en la parte superior de la pantalla (suponiendo que aparecen suficientes elementos en la lista debajo).

Si es así, desde onListItemClick, también debe hacer un esfuerzo para guardar el valor de position, ya que le indica la posición en la lista del elemento seleccionado. Esto le permitiría no necesitar buscar de forma inversa la posición desde el _id.

¿O es por alguna razón que no es una opción para sus propósitos? ¿De verdad necesitas encontrar la posición desde el _id?

+0

Thane, gracias, sí eso es exactamente lo que yo me Nuevo Testamento. No pensé que usar el puesto fuera una buena idea, pero quizás recurriré a eso después de todo. – Jodes

3

hago esto directo en mi propia aplicación:

long lastItem = prefs.getLong(getPreferenceName(), -1); 
if (lastItem >= 0) { 
    cursor.moveToFirst(); 
    while (!cursor.isAfterLast()) { 
     if (lastItem == cursor.getLong(0)) { 
      spinner.setSelection(cursor.getPosition()); 
      break; 
     } 
     cursor.moveToNext(); 
    } 
} 

Spinner se rellena con el contenido del cursor, por lo que sólo se ven a través de ellos y comparar con el identificador de elemento seleccionado. En tu caso, eso sería un ListView.

+0

¡Ese es el efecto que estaba buscando! Esperaba encontrar un camino que me permitiera recorrer todos los artículos, pero tal vez sea inevitable. Gracias – Jodes

+0

gran pedazo de código. realmente ayudó sin un lugar para modificar gracias – j2me

+0

Esta podría ser la solución más rápida, porque funciona directamente con los datos de respaldo, no la vista o el adaptador. – WindRider

Cuestiones relacionadas