Почему этот BindingAdapter не работает в Kotlin?
У меня есть 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, за исключением статической функции.
2 ответа
Эта проблема была вызвана отсутствием kapt в build.gradle приложения. Добавление ниже к build.gradle и замена всех зависимостей "annotationProcessor" на "kapt" решает проблему.
apply plugin: 'kotlin-kapt'
Мы не слишком много работаем с изображениями, но вот наш код
модель
class Habit(val title:String,val description:String,val image:Bitmap) {
и адаптер
Класс HabitsAdapter (val habits: List): RecyclerView.Adapter () {
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
}
}
У меня была другая проблема. Возможно, это не решение вашей проблемы, но, возможно, это принесет пользу другим. То, что я сделал в плюсе, - это добавление заполнителя и сообщения об ошибке в мою функцию загрузки изображения, например:
@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)
}