Как лениво загружать изображения в Android ListView?

Опубликовано: 9 Января, 2023

Во многих случаях пользовательский интерфейс приложения блокируется при загрузке изображений из Интернета. Эту проблему можно решить, реализовав ленивую загрузку изображений в виде списка при отображении текста. Это стратегия определения ресурсов как неважных и загрузки их только при необходимости. Это способ сократить длину критического пути рендеринга, что приводит к сокращению времени загрузки страницы. Дополнительные концептуальные сведения об отложенной загрузке доступны в разделе Что такое отложенная загрузка.

Что мы собираемся построить в этой статье?

Существуют различные библиотеки для реализации ленивой загрузки в Android. Один из них использует универсальную библиотеку загрузчика изображений . Мы реализуем его в этой статье.

Поэтапная реализация

Шаг 1. Создайте новый проект в Android Studio.

Чтобы создать новый проект в Android Studio, обратитесь к разделу «Как создать/запустить новый проект в Android Studio».

Шаг 2: Добавление макета

Добавьте ListView или RecyclerView вместе с необходимыми изображениями для отображения. Ссылки на оба представления следующие:

  • Просмотр списка Android на Java с примером
  • RecyclerView в Android с примером

Шаг 3: Добавление разрешений и зависимостей

Добавьте следующую зависимость в файл build.gradle :

 implementation ‘com.nostra13.universalimageloader:universal-image-loader:1.9.5’

И следующие разрешения в файле manifest.xml

<uses-permission android:name = “android.permission.INTERNET”/>
<uses-permission android:name = “android.permission.WRITE_EXTERNAL_STORAGE”/> 

Шаг 4: Реализация кода Java

Ниже приведен код псевдо-Java, который можно использовать для развертывания отложенной загрузки в любом приложении Android:

Java




```
// Get singleton instance
ImageLoader imageLoader = ImageLoader.getInstance(); 
```
```
// Load image, decode it to Bitmap and 
// display Bitmap in ImageView (or any other view 
// which implements ImageAware interface)
imageLoader.displayImage(imageUri, imageView);
```
```
// Load image, decode it to Bitmap and return Bitmap to callback
imageLoader.loadImage(imageUri, new SimpleImageLoadingListener() {
    @Override
    public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
        // Do whatever you want with Bitmap
    }
});
```
```
// Load image, decode it to Bitmap
// and return Bitmap synchronously
Bitmap bmp = imageLoader.loadImageSync(imageUri);
```
  
```
// Load image, decode it to Bitmap and display
// Bitmap in ImageView (or any other view 
// which implements ImageAware interface)
imageLoader.displayImage(imageUri, imageView, options, new ImageLoadingListener() {
    @Override
    public void onLoadingStarted(String imageUri, View view) {
        ...
    }
    @Override
    public void onLoadingFailed(String imageUri, View view, FailReason failReason) {
        ...
    }
    @Override
    public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
        ...
    }
    @Override
    public void onLoadingCancelled(String imageUri, View view) {
        ...
    }
}, new ImageLoadingProgressListener() {
    @Override
    public void onProgressUpdate(String imageUri, View view, int current, int total) {
        ...
    }
});
```
```
// Load image, decode it to Bitmap and return Bitmap to callback
  
// result Bitmap will be fit to this size
ImageSize targetSize = new ImageSize(80, 50); 
imageLoader.loadImage(imageUri, targetSize, options, new SimpleImageLoadingListener() {
    @Override
    public void onLoadingComplete(String imageUri, View view, Bitmap loadedImage) {
        // Do whatever you want with Bitmap
    }
});
```
```
// Load image, decode it to Bitmap and return Bitmap synchronously
  
// result Bitmap will be fit to this size
ImageSize targetSize = new ImageSize(80, 50); 
Bitmap bmp = imageLoader.loadImageSync(imageUri, targetSize, options);
```

Альтернативные библиотеки

[Fresco]  https://github.com/facebook/fresco
[Glide]  https://github.com/bumptech/glide
[Picasso]  https://github.com/square/picasso
[Volley : ImageLoader]  https://android.googlesource.com/platform/frameworks/volley/