Android бесконечная сетка прокрутки, должен ли адаптер расти бесконечно?
Я реализовал простую бесконечную прокрутку GridView на Android. У меня есть следующие компоненты:
- GridView с onScrollListener, всякий раз, когда GridView прокручивается до самого низа, я запускаю AsyncTask для загрузки большего количества элементов в мой адаптер.
- адаптер, который добавляет элементы, извлеченные из AsyncTask, и запускает notifyDataChanged(), чтобы GridView мог обновиться сам.
Кажется, это работает нормально, за исключением того, что в этом случае адаптер растет бесконечно... Я имею в виду, что я продолжаю добавлять элементы к этому адаптеру всякий раз, когда пользователь прокручивает его до конца, это похоже на проблему с памятью.
Как правильно реализовать бесконечный адаптер? Я ищу концепции, а не стороннюю банку, которая делает это для меня.
Спасибо
решение
Отмеченный ответ имеет правильную теорию. Моя реализация создает резервные копии загруженных данных в базу данных sqllite, поэтому общий поток таков: загрузка данных из Интернета в потоке, анализ и сохранение данных в базе данных в потоке, запуск notifyDataChanged в потоке пользовательского интерфейса.
Метод getCount() адаптера просто выполняет счетчик выбора (id) из базы данных и одновременно извлекает пакет объектов из базы данных в память для использования адаптером.
1 ответ
Да вообще если твой GridView
бесконечен, то ваш Adapter
бесконечен. Если у вас есть наивная реализация просто загрузки большего количества данных в память, то вы наверняка столкнетесь с проблемой памяти в какой-то момент. Чтобы обойти это, вам придется выпустить старые данные в какой-то момент.
Предполагая, что у вашего адаптера есть доступ к некоторому "бесконечному" хранилищу, откуда он получает свои данные (часто из Интернета), вы можете рассмотреть возможность установки максимального размера (в байтах или в количестве элементов) данных, которые будут храниться в памяти для вашего адаптера. Когда вы превысите максимальный размер, вы можете удалить старые элементы из памяти. Если эти старые элементы запрашиваются снова, вы загружаете их снова из бесконечного хранилища, а не из памяти (и, возможно, другие старые элементы удаляются из памяти).
Это означает, что ваш GridView
предметы построены из Adapter
который хранит данные в каком-то кеше (LruCache
может быть полезным здесь), который поддерживается некоторым (возможно, внешним) магазином. Вы также можете поместить дисковый кеш между кешем памяти и внешним хранилищем.