2

Вопрос по baseadapter, android – Что решает, что BaseAdapter.hasStableIds () возвращает true?

Я пытался понять, какBaseAdapter.hasStableIds() работает.

Из того, что я прочитал, вернувшисьtrue Этот метод помогает адаптеру определить, должны ли представления быть воссозданы или оставлены прежними. Я предполагаю, что адаптер каким-то образом отображает положение в id, и если отображение остается прежним, адаптер ничего не делает, когдаnotifyDataSetChanged() называется.

Но не будет ли это проблемой, если данныебыл изменен в то время как идентификатор (и позиция) остается прежним? Если это действительно проблема, когда именно возвращение истинной помощи?

1 ответ
4

hasStableIds() == true означает, что идентификаторы элементов не меняются для базовых элементов данных, а не то, что данные этого элемента никогда не изменяются. Например. один и тот же контакт имеет один и тот же идентификатор, независимо от того, где он появляется в списке, но его имя может со временем меняться - пользователь может изменить его, добавить псевдоним и т. д. Можно представить отображение данных, где у каждого элемента нет определенного стабильного идентификатора. (возможно, данные не ваши, и у вас нет возможности получить уникальный идентификатор, который можно вернуть сgetItemId()например, не совместим сlong тип возврата).

При просмотре исходного кода дляAdapterView а такжеAbsListViewМне кажется, что это в основном полезно, когда вы устанавливаете режим выбора в ListView / GridView, потому что тогда представление может более эффективно управлять идентификаторами проверенных элементов и их визуальным состоянием, в том числе при изменениях набора данных, где те проверенные элементы могли переместиться на новые позиции (но они имеют одинаковый идентификатор).

Спасибо за объяснение. Можете ли вы взглянуть на это:Android - в чем смысл StableID?? Является ли данный ответ неправильным?

от Athena

Если честно, я не уверен на 100%.ListView в частности, это один из самых сложных классов представлений в Android, и код, стоящий за ним, займет много времени, чтобы обернуться. Я полагаю, что возможны некоторые оптимизации в отношении повторного использования представлений, но мне это кажется странным; ListView должен вызватьgetView() для каждой строки, которую он хочет отобразить в любом случае послеnotifyDataSetChanged для того, чтобы вы заполнили данные в каждой строке ...

от Karakuri

ListView должен вызывать getView () для каждой строки, которую он хочет отобразить в любом случае после notifyDataSetChanged Что заставляет вас думать так?

от Alexander Abakumov

Похожие вопросы