代码之家  ›  专栏  ›  技术社区  ›  SilentByte

为什么这个BindingAdapter在Kotlin不起作用?

  •  1
  • SilentByte  · 技术社区  · 6 年前

    val imageUrl = ObservableField<String>()
    

    <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中设置绑定适配器的方式基本相同,没有静态函数。

    2 回复  |  直到 6 年前
        1
  •  32
  •   SilentByte    6 年前

    此问题是由于应用程序的build.gradle中缺少kapt造成的。将下面的添加到build.gradle并用“kapt”替换所有“annotationProcessor”依赖项可以修复此问题。

    apply plugin: 'kotlin-kapt'
    
        2
  •  0
  •   Jaymin    6 年前

    我们并不经常处理图像,但这里是我们的代码

    模型

    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
        }
    }
    
        3
  •  -1
  •   Hampel Előd    6 年前

    @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 ,如果我不想提供任何特定的错误和占位符图像。但我错了,我一直和你犯同样的错误,找不到塞特。。。在清除缓存、删除每个构建文件夹、重启androidstudio几次几个小时之后,我在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)
    }
    
    推荐文章