如何使用 Glide 设置个人资料图片(如果存在),否则使用占位符?

How to set a profile picture if it exists using Glide, otherwise use a placeholder?

我创建了一个致盲适配器:

@BindingAdapter("android:profileImage")
fun setProfileImage(imageView: ImageView, profileImage: String) {
    Glide.with(imageView.context).load(profileImage)
        .placeholder(R.drawable.placeholder)
        .into(imageView)
}

而且效果很好。但是,当我从 public API 请求用户时,在某些情况下 profileImage 为空。我的目标是在 profileImage 不为空时使用 Glide,否则使用 drawable 目录中存在的占位符。这是我对我的 ImageVIew 所做的尝试:

android:profileImage="@{user.isProfilePictureNotNull() ? user.profileImage : @drawable.placeholder}"

其中 isProfilePictureNotNull() 定义为:

fun isProfilePictureNotNull() = profileImage != null

但是 Android Studio 正在满足:

'!=', '%', '*', '+', '-', '/', ':', <, <<, <=, '==', '>', '>=', '>>', '>>>' or '[' expected, got ':'.

如何解决这个问题?

这里的问题是您试图将不是字符串 (@drawable.placeholder) 的内容传递给您的绑定适配器。如果将其替换为字符串,您将看到错误已解决。

我的建议是不要在绑定适配器外部执行逻辑,为什么不在内部执行呢?像这样:

    @BindingAdapter("android:profileImage")
fun setProfileImage(imageView: ImageView, profileImage: String?) {
    if (profileImage != null) {
        Glide.with(imageView.context).load(profileImage)
            .placeholder(R.drawable.placeholder)
            .into(imageView)
    } else {
        imageView.setImageDrawable(R.drawable.placeholder)
    }
}

现在,您的 XML 声明可以简单地是:

android:profileImage="@{user.profileImage}"

此外,Glide 有一个 .error() 调用,您可以将其放入构建器中。我不确定它是否适用于 null 或触发它的原因,但您可以试一试。它看起来像这样,然后:

        @BindingAdapter("android:profileImage")
fun setProfileImage(imageView: ImageView, profileImage: String?) {
    Glide.with(imageView.context).load(profileImage)
        .placeholder(R.drawable.placeholder)
        .error(R.drawable.placeholder)
        .into(imageView)
}