Что делает метод adapter.notifyDataSetInvalidated()? На нем нет документации.
Я пытаюсь перезагрузить ListView и notifyDataSetChanged или notifyDataSetInvalidated, похоже, ничего не выполняет.
Что делает метод adapter.notifyDataSetInvalidated()? На нем нет документации.
Я пытаюсь перезагрузить ListView и notifyDataSetChanged или notifyDataSetInvalidated, похоже, ничего не выполняет.
Это зависит от реализации адаптера... если вы посмотрите на исходный код, вы увидите, что:
notifyDataSetInvalidated()
вызывает notifyInvalidated()
класса DataSetObservable
(см. здесь)notifyInvalidated()
вызывает метод onInvalidated()
для каждого DataSetObserver
(см. здесь).onInvalidated()
ничего не делает...Это его реализация:
public void onInvalidated() {
// Do nothing
}
DataSetObserver
- абстрактный класс, поэтому до подкласса решать, что делать на onInvalidated()
.
Насколько мне известно, метод notifyDataSetInvalidated()
не позволяет адаптеру получить доступ к данным (в случае, если он недействителен, недоступен и т.д.). Метод notifyDataSetChanged()
обновляет ListView
, чтобы вы могли видеть новые данные, но вы должны называть его в потоке пользовательского интерфейса.
Мне очень помогло смотреть это видео - есть два раздела, где они упоминают эти методы и объясняют, как их правильно использовать. Может быть, это тоже помогает:)
Недавно я столкнулся с этим вопросом и хотел разработать для тех, кто интересно программирует, что происходит, когда вы вызываете notifyDataSetChanged()
и notifyDataSetInvalidated()
. * Короткий ответ, перейдите здесь
Как сказал в своем ответе @Cristian, когда вы вызываете эти методы уведомления на своем адаптере, он в основном вызывает несколько классов и заканчивает вызов onChanged()
/onInvalidated()
в зарегистрированном DataSetObserver
для вашего адаптера.
Если вы выполните код, вы действительно увидите, что DataSetObserver
является абстрактным, как указано, и что методы onChanged()
/onInvalidated()
пусты, ожидая реализация подклассом.
Если бы это был конец истории, то почему разработчики Android framework продолжают говорить нам, чтобы мы называли эти методы, если они ничего не делают? Это потребовало некоторого рытья, но оказалось, что уже существует подкласс этого DataSetObserver
, называемый AdapterDataSetObserver
, и он живет в абстрактном классе AdapterView
(который расширяется такими классами, как GridView
и ListView
). Этот наблюдатель автоматически создается Android, когда вы setAdapter()
на своем AdapterView
и получаете зарегистрированный на свой адаптер.
Здесь вы можете увидеть все сумасшедшие вещи, которые на самом деле делают эти методы. Документация плохая, и сначала мне показалось, что мне нужно зарегистрировать свой собственный подкласский DataSetObserver
, чтобы получить эти функции, но оказывается, что один из них уже создан для вас.
* Что-то, что я подумал, может быть полезно: я считаю, что вы можете зарегистрировать более одного DataSetObserver
для своего адаптера (в дополнение к умолчанию). Это позволит вам выполнить некоторую дополнительную работу, если это необходимо (например, возможно, поменять положение индикатора выполнения с представлением изображения при загрузке растровых изображений).
В соответствии с лекцией в мире ListView вам следует использовать ее каждый раз, когда listView ничего не имеет чтобы показать (что означает пустые данные).
Один из примеров, о котором они говорят, - это когда фильтрация выполняется (в методе "publishResults" ). на лекционном видео, он в 36:00.
Странно, почему они просто не объединили его с notifyDataSetChanged, который мог проверять количество элементов и принимать вызов сам по себе...
В соответствии с тем, что я видел, то, что говорилось на лекции, не совсем верно. если адаптер уже показывал какой-то контент раньше, и теперь он ничего не содержит, и теперь вы вызываете notifyDataSetInvalidated, ничего не произойдет, поэтому содержимое останется, поэтому я считаю безопасным использовать notifyDataSetInvalidated только тогда, когда данные не меняются,
Например, если вы обрабатываете фильтрацию и получаете те же результаты (и, возможно, достаточно для проверки количества результатов), как и раньше, вы можете вызвать notifyDataSetInvalidated вместо notifyDataSetChanged