Android - адаптер привязки не работает
Я создал адаптер привязки для отображения изображения с помощью Picasso, но он не работает. У меня есть следующая ошибка:
Обнаружены ошибки привязки данных. **** / ошибка привязки данных **** msg: не удается найти установщик для атрибута "app: loadPicture" с типом параметра java.lang.String для android.widget.ImageView. file:/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
У кого-нибудь будет идея решить мою проблему?
Спасибо!
3 ответа
Спасибо @Blackbelt, чтобы решить мою проблему, я добавил "kotlin-kapt" в Gradle:
apply plugin: 'kotlin-kapt'
Вот мой код
@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
Вы не передаете правильные параметры для функции привязки адаптера.
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
и String, но здесь, в вашем xml, вы передаете объект фотографии
app:loadPicture="@{viewModel.movie.Poster}
Вместо этого вы должны написать что-то вроде этого app:loadPicture="@{viewModel.movie.Poster.url}
Измените свой класс 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)
}
}
Создайте контекст своего класса в соответствии с вашими потребностями, запустите его, чтобы решить вашу проблему.