Проблема в том, что каждое изображение декодируется в момент, когда представление готово к показу. ListView перезапустит ваши представления, что означает, что в тот момент, когда представление покидает экран, оно будет использоваться повторно, и, следовательно, изображение будет перезаписываться и собирать мусор. Если элемент возвращается на экран, изображение должно быть снова декодировано из базы данных.
Декодирование достаточно быстрое, но если пользователь очень быстро меняет позицию в списке, все вызовы декодирования сделают ваш список очень запаздывающим.
Я бы добавил что-то вроде ImageCache. Класс, который содержит карту с WeakReferences к изображениям. Каждый раз, когда вы хотите отобразить изображение, вы смотрите, если изображение уже на карте и WeakReference все еще указывает на объект, если это не так, вам нужно декодировать изображение и затем сохранить его на карте.
Взгляните на ленивые вопросы о загрузке, они покажут вам, как поместить декодирование в фоновую задачу, а затем обновите список в момент загрузки изображений. Это немного больше усилий, но это может сделать список намного быстрее. Если вы собираетесь использовать пример кода из вопросов о отложенной загрузке, попробуйте использовать AsyncTasks вместо Threads для декодирования в.