¿Cuál es el propósito de item-id en Android ListView Adapter?

(No es específico para ListView, sino para el adaptador).

Sigo implementando esto cuando subclase BaseAdapter:

@Override public long getItemId(int position) { return position; } 

Porque tienen que implementar eso. No veo ningún uso de él, necesito getItem (posición) solamente, no getItemId (posición).

Me pregunto si tiene alguna importancia (a Android SDK o algo más)?

Probablemente haya muchas razones para tener ID de artículo estable . No se puede dar una implementación predeterminada ya que depende del tipo de objeto que se almacena en el adaptador.

Android tiene una comprobación para asegurarse de que los ID de artículo se utilizan sólo cuando están establecidos, es decir, la subclase ha reemplazado adecuadamente getItemId ; BaseAdapter.hasStableIds debe ser reemplazado para devolver true.

Pocas razones por las que me he encontrado:

  • El método onItemClick(AdapterView<?> parent, View view, int position, long id) también envía long id

  • The result is only valid if the choice mode has not been set to CHOICE_MODE_NONE and the adapter has stable IDs. método getCheckedItemIds The result is only valid if the choice mode has not been set to CHOICE_MODE_NONE and the adapter has stable IDs.

Respuesta a "Porque tiene que implementar que" : no tiene que Si no utiliza las características, no hay necesidad. Pero si lo hace, no olvide reemplazar boolean hasStableIds() también.

Imagine esta estructura:

Usted tiene notas de la tabla del db con tales 3 expedientes:

 +----+--------------------------+ | ID | Note Text | +----+--------------------------+ | 43 | Note text blah blah | | 67 | Note text blah blah blah | | 85 | Last note | +----+--------------------------+ 

Y se implementa un adaptador para servir estos datos.

Ahora vamos a ver qué posición e identificador de artículo están en tal caso

Position – es un número ordinal de posición de registro en el conjunto de datos cargado. Por ejemplo, si carga esa tabla con ORDER BY ID ASC , entonces

  • El registro con ID 43 tendrá la posición 0 ,
  • El registro con ID 67 tendrá la posición 1 ,
  • Registro con ID 85 tendrá la posición 2

ItemId – es una "clave primaria" de un registro, y su implementación puede devolver dichos valores

  • Registro con ID 43 debería tener itemId 43 ,
  • Registro con ID 67 debería tener itemId 67 ,
  • Registro con ID 85 debe tener itemId 85

Position y itemId en adaptadores estándar de Android

ArrayAdapter / SimpleAdapter

En ArrayAdapter y SimpleAdapter posición y itemId es la misma cosa:

 public long getItemId(int position) { return position; } 

SimpleCursorAdapter (y todos los tipos que heredan de CursorAdapter)

En el SimpleCursorAdapter y todos los descendientes de CursorAdapter itemId es un valor de la columna _id :

 public long getItemId(int position) { if (mDataValid && mCursor != null) { if (mCursor.moveToPosition(position)) { return mCursor.getLong(mRowIDColumn); } else { return 0; } } else { return 0; } } 

Como @Reno escribe, le permite asignar filas en la vista a elementos de conjunto de datos.

Uno de los propósitos de esto es permitir ListViews para realizar un seguimiento de qué elemento está seleccionado, incluso si las posiciones en la lista se cambian o se actualizan los datos subyacentes.

Si subclases ArrayAdapter en su lugar, es posible que no tenga que implementar ese método.

En general, encuentro que el método es útil para determinar qué fila se ha hecho clic durante eventos onClick y utilizar ese ID como parte de los extras de Intent pasados ​​a la siguiente actividad.

Sí, es una función abstracta llamada por android para asignar el ID de fila del conjunto de datos del adaptador a la posición de la lista.

Le invitamos a profundizar

  • ¿Hay una forma de compensar una vista desde el centro en Android?
  • Android canvas drawText y-posición del texto
  • Establecer gravedad para LinearLayout mediante programación
  • ViewPager Adapter getItem siempre llamado para el índice 0 y 1
  • ArrayAdapter.getPosition (item) Returns ¿Qué?
  • Cambio de fondo del elemento de vista de lista de Android
  • Confusión en 'posición' en la función instantiateItem en la clase PagerAdapter (android)
  • Compruebe si la conexión inalámbrica está activada (incluso si no está conectada a ninguna red)
  • Cómo cambiar la posición de inicio de la pista de Android SeekBar?
  • Textview en el botón (arriba), no funciona en Android 5 (API 21)
  • Android - Establecer Layout_Gravity de forma programática para LinearLayout
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.