Как привязать данные к загрузке с помощью Glide? - PullRequest
0 голосов
/ 04 июля 2019

Я пытаюсь загрузить изображение с привязкой данных.Но я никогда не справлялся с этим.Где моя проблема?Ниже приведен мой код и конструкция макета.

MyItemViewModel.kt

  @BindingAdapter("imageUrl")
    fun loadImage(view: RoundedImageView, url: String) = Glide.with(view.context).load(url).into(view)

layout.xml

<data>

    <variable
            name="viewModel"
            type="com.myapp.app.ui.activity.albumlist.AlbumItemViewModel"/>
</data>

  <com.makeramen.roundedimageview.RoundedImageView
                android:layout_width="60dp"
                android:id="@+id/ivRoundedAlbum"
                android:layout_marginStart="@dimen/unit_20_dp"
                app:riv_corner_radius="8dp"
                app:imageUrl="@{viewModel.data.cover}"
                android:layout_height="60dp"/>

Ответы [ 2 ]

1 голос
/ 04 июля 2019

BindingAdapter методы должны быть статическими , поэтому пометка @JvmStatic поможет в этом случае.

Но это сгенерирует 'ошибка времени компиляции' , что "методы не могут быть статичными внутри класса" и поэтому его следует переместить в объект-компаньон или именованные объекты .

В вашем случае у вас есть метод на уровне члена класса , поэтому его перемещение на сопутствующий объект поможет. Так что для MyItemViewModel.kt создайте объект-компаньон и переместите туда метод, как показано ниже:

class MyItemViewModel{
    //Some code
    companion object {

        @JvmStatic
        @BindingAdapter("imageUrl")
        fun loadImage(view: RoundedImageView, url: String) { // This methods should not have any return type, = declaration would make it return that object declaration.
            Glide.with(view.context).load(url).into(view)
        }
    }
    //Some other code
}

Примечание. Также удалите объявление метода с помощью =. Методы привязки должны иметь тип возврата Unit.

0 голосов
/ 04 июля 2019

Я думаю, что лучше всего создать отдельную переменную для imageUrl типа string в layout.xml.BindingAdapter должен быть в классе модели.Кроме того, метод BindingAdapter должен быть статическим, как указано в комментариях.Вы можете сделать это, обернув объект-компаньон аннотацией @JvmStatic.Для более подробной информации проверьте это

    <variable
        name="imageUrl"
        type="String" />
...