Элементы Listview удаляют растровые изображения из памяти, когда пользователь прокручивает

Я работаю над андроидным приложением. У меня есть активность, которая содержит представление списка.

В представлении списка есть много элементов, каждый из которых содержит растровое изображение.

Поскольку список очень велик и содержит много изображений, он выдает и выдает из памяти ошибку на некоторых старых устройствах при загрузке растровых изображений.

Поэтому я ищу способ сделать следующее для старых устройств:

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

Есть ли способ сделать это?

Дополнительная информация:

Я выполнил все инструкции и код о том, как эффективно загружать изображения Bitmap (в документации по Android и на любом сайте, который я мог найти), я также убедился, что нет утечек памяти, я перерабатываю каждый растровый рисунок и слежу за тем, чтобы GC работала правильно И, наконец, на старых устройствах я сделал разрешение изображений наименьшим возможным. Но размер списка приводит к тому, что из-за нехватки памяти все еще появляется на некоторых устройствах.

Поэтому я хочу знать, смогу ли я выполнить предложенное выше решение.

Большое спасибо за любую помощь

Вы должны рассмотреть возможность просмотра приложения «Пример галереи» из Google I / O 2012. Все, что вам нужно, реализовано там.

Видео из Google I / O о приложении галереи

Исходный код доступен в Google Code, и это отличный пример создания галереи. Вы также должны рассмотреть возможность презентации (начало) Romain Guy, где он объясняет проблемы производительности с ListView и учит эффективно использовать адаптеры. (Шаблон ViewHolder и повторное использование представлений).

Вот утилита RecycleListener для GridView (доступна на уровне API 1). RecyclerListener используется для получения уведомлений всякий раз, когда представление помещается внутри кучи отходов RecycleBin. Этот прослушиватель используется для освобождения ресурсов, связанных с представлениями, размещенными в RecycleBin.

 @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.album); mAdapter = new PhotoAdapter(this); mGridView = (GridView) findViewById(android.R.id.list); mGridView.setAdapter(mAdapter); mGridView.setRecyclerListener(new RecyclerListener() { @Override public void onMovedToScrapHeap(View view) { // Release strong reference when a view is recycled final ImageView imageView = (ImageView) view.findViewById(android.R.id.icon); imageView.setImageBitmap(null); } }); // Kick off loader for Cursor with list of photos getLoaderManager().initLoader(LOADER_CURSOR, null, mCursorCallbacks); } 

Вы хотите найти несколько уроков и примеров для «ленивой загрузки».
Один из возможных примеров: https://github.com/thest1/LazyList

Использование библиотеки, такой как Universal Image Loader, дает вам варианты кэширования изображений и управления памятью. Вы должны иметь возможность установить максимальный размер кеша, и он также заботится о загрузке изображений в фоновом потоке.

ListView позаботится о том, чтобы переработать взгляды, которые вы помещали изображения в удобное для вас место в памяти.