Бесконечная сетка прокрутки Android, должен ли адаптер расти бесконечно?

Я реализовал простой GridView с бесконечной прокруткой на Android. У меня есть следующие компоненты:

  1. GridView с onScrollListener, всякий раз, когда GridView прокручивается до самого низа, я запускаю AsyncTask, чтобы загрузить больше элементов в свой адаптер.
  2. адаптер, который добавляет элементы, полученные из AsyncTask, и запускает notifyDataChanged(), чтобы GridView мог обновить себя.

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

Каков правильный способ реализации бесконечного адаптера? Я ищу концепции, а не стороннюю банку, которая делает это за меня.

Спасибо

решение
Отмеченный ответ имеет правильную теорию. Моя реализация резервирует загруженные данные в базу данных sqllite, поэтому общий поток таков: загрузка данных из Интернета в потоке, анализ и сохранение данных в базе данных в потоке, запуск notifyDataChanged в потоке пользовательского интерфейса.
Метод адаптера getCount() просто выполняет выбор счетчика (идентификатора) из базы данных и одновременно извлекает пакет объектов из базы данных в память для использования адаптером.


person Chao    schedule 07.01.2013    source источник
comment
Привет. случайно вы решили эту проблему и можете опубликовать код?   -  person OWADVL    schedule 07.03.2013
comment
да, я поместил свой окончательный подход в исходный вопрос в разделе solution   -  person Chao    schedule 07.03.2013


Ответы (1)


Да, как правило, если ваш GridView бесконечен, то ваш Adapter бесконечен. Если у вас есть наивная реализация простой загрузки большего количества данных в память, то в какой-то момент вы обязательно столкнетесь с проблемой памяти. Чтобы обойти это, в какой-то момент вам придется выпустить старые данные.

Предполагая, что ваш адаптер имеет доступ к некоторому «бесконечному» хранилищу, откуда он получает свои данные (часто из Интернета), вы можете рассмотреть возможность установки максимального размера (либо в байтах, либо в количестве элементов) данных для хранения в памяти для вашего адаптера. Когда вы преодолеете максимальный размер, вы можете очистить память от старых элементов. Если эти старые элементы запрашиваются снова, вы снова загружаете их из бесконечного хранилища, а не из памяти (и, возможно, другие старые элементы удаляются из памяти).

Это означает, что ваши GridView элементы создаются из Adapter, который хранит данные в каком-то кэше ( LruCache здесь может пригодиться), который поддерживается каким-то (вероятно, внешним) магазином. Вы также можете поместить дисковый кеш между кешем памяти и внешним хранилищем.

person kabuko    schedule 07.01.2013
comment
Это определенно звонит в колокольчик, я собираюсь реализовать это и отчитаться. Спасибо! - person Chao; 07.01.2013