5

我有一个 ViewModel:

val imageUrl = ObservableField<String>()

我的布局 XML 有:

<ImageView
    ...
    app:url="@{viewModel.imageUrl}"
    .../>

我有一个具有顶级功能的 BindingAdapters 文件:

@BindingAdapter("url")
fun loadImage(view: ImageView, url: String?) {
    ...
}

我收到以下错误:

data binding error msg:Cannot find the setter for attribute 'app:url' with parameter type android.databinding.ObservableField<java.lang.String> on android.widget.ImageView.

知道为什么会这样吗?这与我在 Java 中设置绑定适配器的方式几乎相同,只是减去了静态函数。

4

3 回答 3

33

此问题是由于应用程序的 build.gradle 中缺少 kapt 引起的。将以下内容添加到 build.gradle 并用“kapt”替换所有“annotationProcessor”依赖项可以解决问题。

apply plugin: 'kotlin-kapt'
于 2018-10-05T14:35:42.380 回答
0

我们不经常使用图像,但这是我们的代码

模型

class Habit(val title:String,val description:String,val image:Bitmap) {

和适配器

class HabitsAdapter(val habits:List<Habit>): RecyclerView.Adapter<HabitsAdapter.HabitViewHolder>() {

class HabitViewHolder(val card:View):RecyclerView.ViewHolder(card)

override fun onBindViewHolder(holder: HabitViewHolder, index: Int) {

    if(holder != null){
        val habit = habits[index]
        holder.card.tvTitle.text = habit.title
        holder.card.tvDescription.text = habit.description
        holder.card.ivINsingle_card.setImageBitmap(habit.image)
    }
}
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): HabitViewHolder {
        val view = LayoutInflater.from(parent.context).inflate(R.layout.single_card, parent,false)
        return HabitViewHolder(view)
    }

    override fun getItemCount(): Int {
        return habits.size
    }
}
于 2018-10-04T21:57:51.673 回答
-1

我有一个不同的问题。这可能不是您问题的解决方案,但也许其他人会从中受益。我在加号中所做的是向我的加载图像函数添加一个占位符和一个可绘制的错误,如下所示:

@JvmStatic
@BindingAdapter("imageUrl", "error", "placeholder")
fun ImageView.setImageFromUrl(imageUrl: String, error: Drawable?, placeholder: Drawable?) {
    Picasso.get()
            .load(imageUrl)
            .placeholder(placeholder
                    ?: ContextCompat.getDrawable(context, R.drawable.ic_general_placeholder)!!)
            .error(error
                    ?: ContextCompat.getDrawable(context, R.drawable.ic_general_error)!!)
            .into(this)
}

我坚持将 放在?Drawables 的末尾就足够了,并且在布局中app:imageUrl,如果我不想提供任何特定的错误和占位符图像,我可以只提供带有 的图像 URL。但我错了,我一直遇到和你一样的错误,找不到设置器......经过几个小时清除缓存,删除每个构建文件夹,重新启动android studio几次后,我在google提供的指南中找到了解决方案. 您需要在内部指定@BindingAdapter是否需要所有属性。所以我像这样修改了我的代码并且它起作用了:

@JvmStatic
@BindingAdapter(value = ["imageUrl", "error", "placeholder"], requireAll = false)
fun ImageView.setImageFromUrl(imageUrl: String, error: Drawable?, placeholder: Drawable?) {
    Picasso.get()
            .load(imageUrl)
            .placeholder(placeholder
                    ?: ContextCompat.getDrawable(context, R.drawable.ic_general_placeholder)!!)
            .error(error
                    ?: ContextCompat.getDrawable(context, R.drawable.ic_general_error)!!)
            .into(this)
}
于 2019-05-31T12:05:34.270 回答