Почему этот BindingAdapter не работает в Котлине?

У меня есть 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, за исключением статической функции.


person SilentByte    schedule 04.10.2018    source источник
comment
попробуйте завернуть его в object и добавить @JvmStatic   -  person EpicPandaForce    schedule 05.10.2018
comment
Пробовал и так, та же ошибка.   -  person SilentByte    schedule 05.10.2018


Ответы (3)


Эта проблема была вызвана отсутствием kapt в файле build.gradle приложения. Добавление приведенного ниже в build.gradle и замена всех зависимостей «annotationProcessor» на «kapt» устраняет проблему.

apply plugin: 'kotlin-kapt'
person SilentByte    schedule 05.10.2018

Мы не так много работаем с изображениями, но вот наш код

Модель

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
    }
}
person Vector    schedule 04.10.2018
comment
Спасибо, но мой вопрос не связан с ViewHolder. Мой вопрос касается создания пользовательских атрибутов XML, привязанных к функции. - person SilentByte; 05.10.2018

У меня была другая проблема. Возможно, это не решение вашей проблемы, но, возможно, это принесет пользу другим. Что я сделал плюс, так это добавил заполнитель и ошибку, которую можно нарисовать, а также к моей функции загрузки изображения, например:

@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 было достаточно, и в макете я мог просто указать URL-адрес изображения с app:imageUrl, если я не хочу указывать какие-либо конкретные ошибки и изображения-заполнители. Но я ошибался, я продолжал получать ту же ошибку, что и вы, Не могу найти сеттер... После нескольких часов очистки кеша, удаления каждой папки сборки, перезапуска студии Android несколько раз я нашел решение в предоставленном 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)
}
person Hampel Előd    schedule 31.05.2019