Установить видимость индикатора выполнения после завершения загрузки изображения с помощью библиотеки Glide


Привет я хочу иметь индикатор выполнения для изображения, которое будет показано во время загрузки изображения, но когда загрузка изображения будет завершена, я хочу установить его в gone. Раньше я использовал для этого библиотеку Пикассо. Но я не знаю, как использовать его с библиотекой Glide. У меня есть идея, что некоторые ресурсы готовы функция есть, но я не знаю, как ее использовать. Кто-нибудь может мне помочь?

код для библиотеки Пикассо

Picasso.with(mcontext).load(imgLinkArray.get(position).mUrlLink)
       .into(imageView, new Callback() {
           @Override
           public void onSuccess() {
               progressBar.setVisibility(View.GONE);
           }

           @Override
           public void onError() {
           }
        })
;

Теперь, как я могу сделать это с Glide?

Glide.with(mcontext).load(imgLinkArray.get(position).mUrlLink)
     .into(imageView);

Я возможность загрузить изображение с помощью этого с Glide, но как я могу написать progressBar.setVisibility(View.GONE); где-то в коде, если изображения загружаются?

7 63

7 ответов:

вопрос довольно старый, и я не знаю, какова была ситуация с glide в те времена, но теперь это можно легко сделать со слушателем (не так, как предлагается в ответе, выбранном как правильный).

progressBar.setVisibility(View.VISIBLE);
Glide.with(getActivity())
     .load(args.getString(IMAGE_TO_SHOW))
     .listener(new RequestListener<String, GlideDrawable>() {
         @Override
         public boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource) {
             return false;
         }

         @Override
         public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) {
             progressBar.setVisibility(View.GONE);
             return false;
         }
     })
     .into(imageFrame)
;

вы возвращаете true, если хотите сами обрабатывать такие вещи, как анимация, и false, если хотите скользить, чтобы обрабатывать их для вас.

мой ответ был основан на устаревших API. Смотрите здесь для более современного ответа.

в исключении поставьте условие для показа снова ProgressBar

 Glide.with(context)
    .load(image_url)
    .listener(new RequestListener<String, GlideDrawable>() {
        @Override
        public boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource) {
            if(e instanceof UnknownHostException)
                progressBar.setVisibility(View.VISIBLE);
            return false;
        }

        @Override
        public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) {
            progressBar.setVisibility(View.GONE);
            return false;
        }
    })
    .into(imageView);

Если вы хотите сделать это в Котлине, вы можете попробовать так:

    Glide.with(context)
            .load(url)
            .listener(object : RequestListener<Drawable> {
                override fun onLoadFailed(e: GlideException?, model: Any?, target: Target<Drawable>?, isFirstResource: Boolean): Boolean {
                    //TODO: something on exception
                }
                override fun onResourceReady(resource: Drawable?, model: Any?, target: Target<Drawable>?, dataSource: DataSource?, isFirstResource: Boolean): Boolean {
                    Log.d(TAG, "OnResourceReady")
                    //do something when picture already loaded
                    return false
                }
            })
            .into(imgView)

выше решение работает очень хорошо для меня, но когда я использую asBitmap() чтобы загрузить изображение. Это не работает.

нам нужно использовать BitmapImageViewTarget

Glide.with(this) .load(imageURL)
 .asBitmap()
 .placeholder(R.drawable.bg)
 .into(new BitmapImageViewTarget(imageView) {
            @Override
            public void onResourceReady(Bitmap  drawable, GlideAnimation anim) {
                super.onResourceReady(drawable, anim);
                progressBar.setVisibility(View.GONE);
            }
        });
  1. в xml возьмите индикатор выполнения с высотой и шириной (match_parent).
  2. перед вызовом ниже метода упоминания установите видимость индикатора выполнения.

    public void setImageWIthProgressBar(Context context, final ImageView imageView, String imageUrl, final ProgressBar progressBar) {
    
            Glide.with(context)
                    .load(imageUrl)
                    .listener(new RequestListener<String, GlideDrawable>() {
                        @Override
                        public boolean onException(Exception e, String model, Target<GlideDrawable> target, boolean isFirstResource) {
                            progressBar.setVisibility(View.GONE);
                            return false;
                        }
    
                        @Override
                        public boolean onResourceReady(GlideDrawable resource, String model, Target<GlideDrawable> target, boolean isFromMemoryCache, boolean isFirstResource) {
                            progressBar.setVisibility(View.GONE);
                            return false;
                        }
                    })
                    .into(imageView);
    
        }//setImageWIthProgressBar
    

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

загрузите gif progressbar и назовите его progressbargif и поместите его в папку для рисования.

        Glide.with(ctx)
            .load(url)
            .thumbnail(Glide.with(ctx).load(R.drawable.progressbargif))
            .diskCacheStrategy(DiskCacheStrategy.SOURCE)
            .error(R.drawable.image_unavailable)
            .crossFade(200)
            .into(iv);

после загрузки изображения url-адреса миниатюра исчезает. Миниатюра исчезает сразу же после загрузки кэшированного изображения.