安卓 - 绑定适配器无法工作

8
我创建了一个绑定适配器,以用picasso来显示图片,但它不能正常工作。我遇到了以下错误:
找到数据绑定错误。 ****/ 数据绑定错误 ****msg:无法在android.widget.ImageView上找到参数类型为java.lang.String的属性'app:loadPicture'的setter。 file:/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 有人有解决我的问题的想法吗?
谢谢!

5
如果在你的 build.gradle 中添加 apply plugin: 'kotlin-kapt',这会有所帮助吗? - Blackbelt
我认为这不正确,但将app的名称更改为其他以用于loadpicture属性。 - Hemant Parmar
你能发完整的XML文件吗? - fightingCoder
@fightingCoder https://github.com/mlabar/android-jetpack/blob/tech_ajout_databinding/app/src/main/res/layout/activity_detail_movie.xml - MLabar
@Blackbelt 感谢您的回复,我会尝试 :) - MLabar
可能是因为你在一个对象内声明了你的绑定适配器,而不是在普通类中声明? - Sir Codesalot
4个回答

27

感谢 @Blackbelt 帮我解决了问题,我已经在所有的build.gradle模块中添加了"kotlin-kapt":

apply plugin: 'kotlin-kapt'

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上的项目


谢谢您的回复。我尝试了,但它不起作用。 - MLabar

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)
    }
}

根据您的需求设置类上下文,运行它,希望它能解决您的问题。


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}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接