Android-绑定适配器不起作用

时间:2018-07-19 09:05:27

标签: android kotlin picasso android-binding-adapter

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

  

发现数据绑定错误。   **** /数据绑定错误**** msg:找不到参数类型为java.lang.String的属性“ app:loadPicture”的设置器   android.widget.ImageView。   文件:/home/groupevsc.com/mathieu_labar/Documents/Projects/android-jetpack/app/src/main/res/layout/activity_detail_movie.xml   loc: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 个答案:

答案 0 :(得分:16)

谢谢@Blackbelt解决我的问题,我在gradle中添加了“ kotlin-kapt”:

apply plugin: 'kotlin-kapt'

答案 1 :(得分: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上的项目

答案 2 :(得分: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)
    }
}

根据需要设置类上下文,然后运行它,希望可以解决您的问题。

答案 3 :(得分:0)

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

对象CommonBindingUtil {

34.315.167.4:3000

}

此处@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和一个字符串,但是在这里,您的xml中正在传递照片的对象

imageView

您应该改写这样的app:loadPicture="@{viewModel.movie.Poster}