Android – в чем смысл StableID?

Я реализую ListAdapter ExpandableListView, во время работы вижу, что мне нужно переопределить функцию boolean hasStableIds (). Может ли кто-нибудь объяснить, каково значение стабильных идентификаторов? Когда мне это нужно?

Solutions Collecting From Web of "Android – в чем смысл StableID?"

Стабильные идентификаторы позволяют оптимизировать ListView для случая, когда элементы остаются неизменными между notifyDataSetChanged . Идентификаторами, на которые он ссылается, являются те, которые возвращаются из getItemId .

Без него ListView должен воссоздать все View s, так как он не может знать, совпадают ли идентификаторы элементов между изменениями данных (например, если идентификатор является только индексом в данных, он должен воссоздать все). С его помощью он может воздерживаться от воссоздания View s, который сохранил их идентификаторы предметов.

Если hasStableIds() возвращает false, то каждый раз, когда вы вызываете notifyDataSetChanged() ваш адаптер будет искать возвращаемое значение getItemId и в конечном итоге вызовет getView(int position, View convertView, ViewGroup parent) только для тысяч элементов, значение которых изменилось.

Используя этот метод, вы можете легко обновить только один элемент в ListView

Если вы правильно реализуете getItemId это может быть очень полезно.

Пример :

У вас есть список альбомов:

 class Album{ String coverUrl; String title; } 

И вы реализуете getItemId следующим образом:

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

Теперь ваш идентификатор элемента зависит от значений полей coverUrl и заголовка, и если вы измените их и вызовите notifyDataSetChanged() на вашем адаптере, тогда адаптер вызовет метод getItemId () для каждого элемента и обновит только те элементы, которые изменили идентификатор.

Это очень полезно, если вы выполняете «тяжелые» операции в getView() .