我的应用程序中有几个RecyclerView
,并且所有这些项目都有ImageView
的项目,这些项目进一步填充了Glide
,如下所示:< / p>
Glide.with(context)
.load(imageUrl)
.asBitmap()
.error(R.drawable.placeholder_avatar)
.centerCrop()
.into(mAvatarImageView);
在我的首选项屏幕中,用户可以禁用所有远程图像的加载以节省带宽。
如果不使用违反DRY原则的所有Glide
适配器中的经典if-else条件,告诉RecyclerView
不加载图片的最佳方法是什么?
我正在寻找这样的方法:
.shouldLoad(UserSettings.getInstance().isImageLoadingEnabled());
答案 0 :(得分:3)
假设您使用的是Glide v4,则会有专门为此目的设计的请求选项:RequestOptions.onlyRetrieveFromCache(boolean flag)
。启用后,仅加载内存或磁盘缓存中已存在的资源,有效防止来自网络的负载并节省带宽。
如果您使用Glide v4 Generated API,则此选项可直接在GlideRequest
返回的GlideApp.with(context).asBitmap()
上使用。
否则,您必须创建RequestOptions
并启用此标记并apply
:
RequestOptions options = new RequestOptions().onlyRetrieveFromCache(true);
Glide.with(context).asBitmap()
.apply(options)
.error(R.drawable.placeholder_avatar)
.centerCrop()
.into(mAvatarImageView);
答案 1 :(得分:2)
如果您决定使用Kotlin
,则可以创建所需的扩展功能:
fun <T> RequestBuilder<T>.shouldLoad(neededToLoad : Boolean) : RequestBuilder<T> {
if(!neededToLoad) {
return this.load("") // If not needed to load - remove image source
}
return this // Continue without changes
}
然后你可以使用它,正如你所描述的那样:
Glide.with(context)
.load(imageUrl)
.shouldLoad(false)
.into(imageView)
可以公平地说,您只能使用Kotlin
函数创建一个shouldLoad()
文件并在Java
中使用它,但代码变得丑陋:
shouldLoad(Glide.with(this)
.load(imageUrl), false)
.into(imageView);
OR
RequestBuilder<Drawable> requestBuilder = Glide.with(this)
.load(imageUrl);
requestBuilder = shouldLoad(requestBuilder, true);
requestBuilder.into(imageView);