Android: ¿cuál es el significado de StableIDs?

Estoy implementando un ListAdapter de ExpandableListView, mientras trabajo veo que necesito sobreescribir la función boolean hasStableIds (). ¿Alguien puede explicarme cuál es el significado de los identificadores estables? cuando necesito esto?

Los ID estables permiten que ListView optimice para el caso cuando los elementos permanecen iguales entre notifyDataSetChanged llamadas notifyDataSetChanged . Los ID a los que se refiere son los devueltos por getItemId .

Sin él, ListView tiene que volver a crear todas las View , ya que no puede saber si los ID de los artículos son los mismos entre los cambios de datos (por ejemplo, si el ID es solo el índice de los datos, debe volver a crear todo). Con él, puede abstenerse de volver a crear View que conservaban sus ID de elementos.

Si hasStableIds() devuelve falso, cada vez que llame a notifyDataSetChanged() su adaptador mirará el valor devuelto de getItemId y eventualmente llamará a getView(int position, View convertView, ViewGroup parent) solo para los artículos que hayan cambiado.

Usando esta técnica puedes actualizar fácilmente solo un elemento en el ListView

Si implementa getItemId correctamente, puede ser muy útil.

Ejemplo:

Usted tiene una lista de álbumes:

 class Album{ String coverUrl; String title; } 

Y implementa getItemId así:

 @Override public long getItemId(int position){ Album album = mListOfAlbums.get(position); return (album.coverUrl + album.title).hashCode(); } 

Ahora la identificación de su artículo depende de los valores de los campos coverUrl y title y si los cambia y llama notifyDataSetChanged() en su adaptador, entonces el adaptador llamará al método getItemId () de cada elemento y actualizará solo aquellos elementos cuya identificación ha cambiado.

Esto es muy útil si estás haciendo algunas operaciones “pesadas” en tu getView() .