Стабильный идентификатор против DiffCallback для RecyclerView - PullRequest
1 голос
/ 12 февраля 2020

У меня есть собственный класс для данных, отображаемых в моем RecyclerView. Каждый объект и, следовательно, каждая строка имеет уникальное значение идентификатора для поля id в классе.

Всякий раз, когда я обновляю данные sh, список очищается, заполняется и вызывается notifyDataSetChanged(). Это вызывает эффект мерцания.

Во время этих обновлений, хотя id остается неизменным, некоторые другие поля изменяются, и некоторые из этих изменяющихся полей должны быть отражены в представлении элемента.

Должен ли я быть использование setHasStableIds(true) в сочетании с getItemId() ИЛИ я должен использовать DiffCallback, где я могу переопределить areItemsTheSame() и areContentsTheSame()?

Если я использую прежний, я не уверен, что он может обнаружить изменения в других полях и обновить строку.

1 Ответ

0 голосов
/ 12 февраля 2020

Если вы можете, вы всегда должны предпочитать DiffCallback. Стабильные идентификаторы могут сравнивать только идентичность, но не содержимое. Это приводит к эффекту мерцания, который вы описываете при изменении содержимого элемента, потому что RecyclerView вынужден предположить, что содержимое могло измениться, и повторно привязать его / выполнить анимацию изменения элемента. DiffCallback не имеет такого ограничения и всегда будет делать правильно, если обратный вызов реализован правильно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...