在 android recyclerview - Java 中根据不同的 url 滑动加载相同的图像

Glide loading same image given diferent urls in android recyclerview - Java

我很好地实现了 glide,但问题是它在 recyclerview 中为具有不同 urls 的不同图像视图加载相同的图像。

主要问题是我怎样才能加载所需的图像并仍然保留本地缓存以保存用户数据?这是我的代码:

    Glide.with(context).load(objects.get(position)).apply(new RequestOptions().fitCenter().error(R.drawable.logo).placeholder(R.drawable.logo).diskCacheStrategy(DiskCacheStrategy.ALL)).into(new SimpleTarget<Drawable>() {
  @Override
  public void onResourceReady(@NonNull Drawable resource, @Nullable Transition<? super Drawable> transition) {
    imageView.setImageDrawable(resource);
    progressBar.setVisibility(View.GONE);
  }
});

而不是做这样的事情:

.into(new SimpleTarget<Drawable>() {
  @Override
  public void onResourceReady(@NonNull Drawable resource, @Nullable Transition<? super Drawable> transition) {
    imageView.setImageDrawable(resource);
    progressBar.setVisibility(View.GONE);
  }
});

只需将您的 imageView 放入 into 函数即可。如果您仍然希望在加载完成时收到通知,您可以使用 listener 函数。您的代码应如下所示:

Glide
   .with(context)
   .load(objects.get(position))
   .apply(new 
           RequestOptions()
                     .fitCenter()
                     .error(R.drawable.logo)
                     .placeholder(R.drawable.logo)
                     .diskCacheStrategy(DiskCacheStrategy.ALL)
          )
   .listener(new SimpleTarget<Drawable>() {
        @Override
        public void onResourceReady(@NonNull Drawable resource, @Nullable 
                                   Transition<? super Drawable> transition) {
            progressBar.setVisibility(View.GONE);
        }
   })
 .into(imageView);

Glide 应该自己处理 RecyclerView 生命周期。您唯一需要做的就是隐藏进度条。您不需要自己将drawable设置到ImageView中。

更新: 提到的方法是最好的,但是在 .listener() 中使用 SimpleTarget<?>() 时,它给了我一些 lint 错误,可能是由于可能的版本差异,迫使我使用 RequestListener<Drawable>() 和有效:

    Glide.with(holder.service_image.getContext()).load(imageArray.get(0)).apply(new RequestOptions().fitCenter().error(R.drawable.logo).placeholder(R.drawable.logo).diskCacheStrategy(DiskCacheStrategy.ALL)).listener(new RequestListener<Drawable>() {
      @Override
      public boolean onLoadFailed(@Nullable GlideException e, Object model, Target<Drawable> target, boolean isFirstResource) {
        return false;
      }

      @Override
      public boolean onResourceReady(Drawable resource, Object model, Target<Drawable> target, DataSource dataSource, boolean isFirstResource) {
        holder.progressBar.setVisibility(View.GONE);
        return false;
      }
    }).into( holder.service_image);