Android – quelle est la signification de StableIDs?

J’implémente un ListAdapter de ExpandableListView, pendant que je travaille, je vois que je dois dépasser la fonction boolean hasStableIds (). Quelqu’un peut-il expliquer s’il vous plaît quelle est la signification des identifiants stables? quand j’ai besoin de ça?

Les identifiants stables permettent à ListView d’optimiser pour le cas où des éléments restnt les mêmes entre les appels notifyDataSetChanged . Les identifiants getItemId il fait référence sont ceux renvoyés par getItemId .

Sans elle, ListView doit recréer toutes les View car il ne peut pas savoir si les identifiants d’éléments sont les mêmes entre les modifications de données (par exemple, si l’ID est uniquement l’index dans les données, il doit tout recréer). Avec cela, il peut s’abstenir de recréer des View qui conservent leurs identifiants.

Si hasStableIds() renvoie false, chaque fois que vous appelez notifyDataSetChanged() votre adaptateur examinera la valeur renvoyée par getItemId et appellera getView(int position, View convertView, ViewGroup parent) uniquement pour mille éléments dont l’id a changé.

En utilisant cette technique, vous pouvez facilement mettre à jour un seul élément dans ListView

Si vous implémentez getItemId correctement, cela pourrait être très utile.

Exemple :

Vous avez une liste d’albums:

 class Album{ Ssortingng coverUrl; Ssortingng title; } 

Et vous implémentez getItemId comme ceci:

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

Maintenant, votre identifiant dépend des valeurs de coverUrl et des champs title et si vous les modifiez et appelez notifyDataSetChanged() sur votre adaptateur, la carte appellera la méthode getItemId () de chaque élément et ne mettra à jour que les éléments modifiés.

Ceci est très utile si vous effectuez des opérations “lourdes” dans votre getView() .