#android #sqlite #galleryview
#Android #sqlite #galleryview
Вопрос:
У меня есть база данных sqlite, в которой более 2000 миниатюр изображений с низким разрешением. Размер самой базы данных превышает 100 МБ. Проект требует, чтобы у меня были фотографии, находящиеся в базе данных, а не путь к файлу.
Это то, что я хотел бы сделать, и мне нужна помощь, поскольку я впервые имею дело с изображениями. В пользовательском интерфейсе моего приложения есть горизонтальный GalleryView, который я хочу динамически заполнять изображениями, извлеченными из этой базы данных. Я не возражаю, если эти изображения будут загружены в галерею в фоновом режиме. Я где-то читал, что мне придется использовать ImageAdapter для динамической привязки изображений к элементу пользовательского интерфейса. Мне нужно понять, как это делается. Я никогда не использовал класс BaseAdapter.
Спасибо, AB
Ответ №1:
Вы действительно создадите подкласс адаптера для извлечения изображений из вашей базы данных, превратив их в растровые изображения или чертежи, затем установите для вашего изображения значение ImageView и добавьте его в свою галерею.
Я бы посоветовал вам отказаться от использования галереи прямо сейчас, прежде чем приступить к работе. В галерее есть ошибка, из-за которой она не позволяет вашему адаптеру правильно перерабатывать представления. Это означает, что, когда пользователь прокручивает галерею каждый раз, когда на экране появляется новое изображение, создается новый объект ImageView. Это расточительно и приведет к заметному снижению производительности во время прокрутки вашей галереи из-за постоянно работающей сборки мусора.
Чтобы начать работу с вашим адаптером, ознакомьтесь с SimpleCursorAdapter и найдите в Интернете примеры расширения SimpleCursorAdapter. Внутри вашего метода getView вы извлекаете свое изображение из базы данных и устанавливаете его в представление, которое будет показано пользователю.
Комментарии:
1. Спасибо за быстрое обновление, Тим. Однако, если бы я оставил GalleryView как есть в пользовательском интерфейсе и предоставил пользователю доступ к нему только после загрузки всех изображений из базы данных, как бы я это сделал? К сожалению, у меня нет возможности избавиться от представления типа горизонтальной галереи для моих изображений.
2. Другими словами, считаете ли вы, что загрузка более 2000 изображений в галерею займет огромное количество времени?
3. Он не будет загружать все 2000 одновременно. Он загрузит то, что ему нужно, только для заполнения экрана. Затем, когда пользователь прокручивает достаточно далеко, чтобы показывался новый, он загружает этот новый. Таким образом, он не загружает все, что есть на экране.
Ответ №2:
Я смог сделать это с помощью пользовательского адаптера и массива строк, который содержит местоположение изображений на SD-карте. Однако, прежде чем делать все это, я должен извлечь изображения из базы данных и скопировать их в папку sdcard. Я работаю над тем, чтобы избежать этого шага, поскольку он добавляет 5-7 секунд, чтобы просто скопировать эти изображения.