【问题标题】:Android - Binding adapter not workingAndroid - 绑定适配器不起作用
【发布时间】:2018-07-19 09:05:26
【问题描述】:

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

发现数据绑定错误。 ****/ 数据绑定错误 ****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

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

谢谢!

【问题讨论】:

  • apply plugin: 'kotlin-kapt' 添加到build.gradle 有帮助吗?
  • 我不认为这是正确的,但将名称 app 更改为其他加载图片属性。
  • 你可以发送完整的xml文件吗?
  • @Blackbelt 谢谢你的回复,我会努力的:)

标签: android kotlin picasso android-binding-adapter


【解决方案1】:

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

    【讨论】:

    • 感谢您的回复。我试过了,还是不行。
    【解决方案3】:

    像这样更改您的 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)
        }
    }
    

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

    【讨论】:

      【解决方案4】:

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

      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}

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2023-03-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多