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

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

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

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

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

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

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

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

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

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

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

11
добавлено
Просмотры: 2
nl ja de
Вы пытались реализовать шаблон View Holder?
добавлено автор Igor Ganapolsky, источник

3 ответы

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

Video from Google I/O about gallery app

Исходный код доступен в 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);
}
11
добавлено
Большое спасибо!
добавлено автор kaitian521, источник

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

0
добавлено
Я могу ошибаться в этом, но не ленивая загрузка только для загрузки изображений по мере их появления, но не удаления уже загруженной картинки?
добавлено автор Youssef, источник
Это зависит от реализации. Может быть, ленивая загрузка по умолчанию - это то, как вы ее описываете, но я знаю, что данный пример отсутствует. Вы можете увидеть его (и много других больших библиотек), работающих в приложении шаблонов пользовательского интерфейса: play.google.com/store/apps/details?id=com.groidify.uipattern‌ s
добавлено автор Stefan de Bruijn, источник

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

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

0
добавлено
Возможно, что-то вроде Пикассо.
добавлено автор Igor Ganapolsky, источник