Android: установка изображения-заполнителя с помощью Glide - DataBinding - PullRequest
0 голосов
/ 20 января 2020

Загрузка изображения через привязку данных очень проста. Я использую Glide в своем проекте. Я должен установить изображение заполнителя, которое будет меняться в зависимости от выбора пользователем. Можем ли мы использовать какое-то выражение, которое принимает ссылки на изображения imageurl и placeHolder.

<androidx.appcompat.widget.AppCompatImageView
        android:id="@+id/vehicle_1_image"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="@dimen/margin_twenty"
        app:layout_constraintEnd_toEndOf="@id/centerGuideline"
        app:layout_constraintStart_toStartOf="@id/centerGuideline"
        app:layout_constraintTop_toBottomOf="@id/txt_enter_vehicle_name"
        app:loadImage="@{viewModel.imgUrl}" />

@BindingAdapter({"loadImage"})
public static void loadUrlImage(ImageView view, String url, int placeHolderImage){
    ImageLoaderUtil.getInstance().loadImageWithCache(view, url, placeHolderImage);
}

public void loadImageWithCache(ImageView imageView, String url, int placeholderImage) {
    Glide.with(imageView.getContext())
            .load(url)
            .apply(getDefaultGlideOptions())
            .diskCacheStrategy(DiskCacheStrategy.AUTOMATIC)
            .placeholder(placeholderImage)
            .into(imageView);
}

Ответы [ 2 ]

2 голосов
/ 20 января 2020

Нашел эту замечательную статью: https://ayusch.com/databinding-with-glide-android/

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

Так что я думаю, что слушатели - это ответ. Также отправьте код, если ссылка мертва.

companion object {
        @JvmStatic
        @BindingAdapter(value = ["profileImage", "error"], requireAll = false)
        fun loadImage(view: ImageView, profileImage: String, error: Int) {
            Glide.with(view.context)
                .load(profileImage)
                .listener(object : RequestListener<Drawable> {
                    override fun onLoadFailed(
                        e: GlideException?,
                        model: Any?,
                        target: Target<Drawable>?,
                        isFirstResource: Boolean
                    ): Boolean {
                        view.setImageResource(error)
                        return true
                    }
                    override fun onResourceReady(
                        resource: Drawable?,
                        model: Any?,
                        target: Target<Drawable>?,
                        dataSource: DataSource?,
                        isFirstResource: Boolean
                    ): Boolean {
                        view.setImageDrawable(resource)
                        return true
                    }
                })
                .into(view)
        }
}

и в вашем макете:

app:error="@{user.errorImage}"
1 голос
/ 20 января 2020

Вы можете добавить несколько параметров в BindingAdapter, как это.

 @BindingAdapter("url","placeHolderImage")
  public static void loadUrlImage(ImageView view, String url, int placeHolderImage)
  {
     ImageLoaderUtil.getInstance().loadImageWithCache(view, url, placeHolderImage);
  }

И вам нужно добавить поле в Imageview xml, как это.

<androidx.appcompat.widget.AppCompatImageView
    android:id="@+id/vehicle_1_image"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginTop="@dimen/margin_twenty"
    app:layout_constraintEnd_toEndOf="@id/centerGuideline"
    app:layout_constraintStart_toStartOf="@id/centerGuideline"
    app:layout_constraintTop_toBottomOf="@id/txt_enter_vehicle_name"
    app:url="@{viewModel.imgUrl}"
    app:placeHolderImage="@{viewModel.}" 
    />

У вас есть две вещи xml Url и Placeholder.

...