在 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);
我很好地实现了 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);