8

我创建了一个绑定适配器来用毕加索显示图片,但它不起作用。我有以下错误:

发现数据绑定错误。****/ 数据绑定错误 ****msg:在 android.widget.ImageView 上找不到参数类型为 java.lang.String 的属性“app:loadPicture”的设置器。文件:/home/groupevsc.com/mathieu_labar/Documents/Projects/android-jetpack/app/src/main/res/layout/activity_detail_movie.xml 位置:27:31 - 27:52 ****\ 数据绑定错误 * ***

这是我的绑定适配器:

object CommonBindingUtil {

    @JvmStatic
    @BindingAdapter("loadPicture")
    fun loadPicture(view: ImageView, text: String) {
        Picasso.with(view.context)
                .load(text)
                .error(R.drawable.ic_movie_24)
                .fit()
                .placeholder(R.drawable.ic_movie_24)
                .into(view)
    }

}

我的 XML 有属性 "app:loadPicture" :

<ImageView
    android:id="@+id/picture"
    android:layout_width="@dimen/material_image_simple_width"
    android:layout_height="wrap_content"
    android:adjustViewBounds="true"
    android:scaleType="fitXY"
    android:src="@drawable/ic_movie_24"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    app:loadPicture="@{viewModel.movie.Poster}"/>

这是我的 GitHub 存储库: https ://github.com/mlabar/android-jetpack/tree/tech_ajout_databinding

有人有想法解决我的问题吗?

谢谢!

4

4 回答 4

27

谢谢@Blackbelt 解决了我的问题,我在所有build.gradle模块中都添加了“kotlin-kapt”:

apply plugin: 'kotlin-kapt'
于 2018-07-19T13:24:51.223 回答
2

这是我的代码

@JvmStatic
    @BindingAdapter({"bind:loadPicture"})
    fun loadPicture(view: ImageView, loadPicture: String) {
        Picasso.with(view.context)
                .load(loadPicture)
                .error(R.drawable.ic_movie_24)
                .fit()
                .placeholder(R.drawable.ic_movie_24)
                .into(view)
    }

有关更多详细信息,请参阅我在 GitHub 上的项目

于 2018-07-19T09:36:08.880 回答
0

像这样更改您的MovieViewModel类:

class MovieViewModel(private val movie: Movie) : Observer, BaseObservable() {

    init {
       Movie.addObserver(this)
    }
    val Poster: String
        @Bindable get() {
            return Poster.name
        }
}

像这样的电影类:

class Movie: Observable() {
    var Title: String = ""
        set(value) {
            field = value
            setChangedAndNotify("Title")
        }
    var Year: String = ""
        set(value) {
            field = value
            setChangedAndNotify("Year")
        }
    var imdbID: String = ""
        set(value) {
            field = value
            setChangedAndNotify("imdbID")
        }
    var Type: String = ""
        set(value) {
            field = value
            setChangedAndNotify("Type")
        }
    var Poster: String = ""
        set(value) {
            field = value
            setChangedAndNotify("Poster")
        }
    var Plot: String = ""
        set(value) {
            field = value
            setChangedAndNotify("Plot")
        }

    private fun setChangedAndNotify(field: Any) {
        setChanged()
        notifyObservers(field)
    }
}

根据您的需要制作您的课程上下文,运行它希望它能解决您的问题。

于 2018-07-19T09:39:59.923 回答
0

您没有为绑定适配器功能传递正确的参数。

object CommonBindingUtil {

    @JvmStatic
    @BindingAdapter("loadPicture")
    fun loadPicture(view: ImageView, text: String) {
        Picasso.with(view.context)
            .load(text)
            .error(R.drawable.ic_movie_24)
            .fit()
            .placeholder(R.drawable.ic_movie_24)
            .into(view)
    }
}

这里的loadPicture函数需要参数imageView和一个字符串,但是在这里,在你的 xml 中你正在传递照片的对象

app:loadPicture="@{viewModel.movie.Poster}

你应该写这样的东西app:loadPicture="@{viewModel.movie.Poster.url}

于 2019-12-27T11:06:29.620 回答