Я пробую новую библиотеку android x, которая заменила старую библиотеку appCompat в android. И я столкнулся с одной проблемой. Я хочу загрузить изображение в элемент recyclerView и для этого хочу использовать привязку данных. Вот мой код
<androidx.appcompat.widget.AppCompatImageView
app:loadImageFromNetwork = "@{car.model.photoUrl}" <- here I'm using binding class
android:id = "@+id/appCompatImageView"
android:layout_width = "170dp"
android:layout_height = "0dp"
app:layout_constraintBottom_toBottomOf = "parent"
app:layout_constraintStart_toStartOf = "parent"
app:layout_constraintTop_toTopOf = "parent" />
и вот мой класс привязки
import androidx.appcompat.widget.AppCompatImageView
import androidx.databinding.BindingAdapter
import com.bumptech.glide.Glide
object Bindings {
@JvmStatic
@BindingAdapter("loadImageFromNetwork")
fun loadImageFromNetwork(imageView: AppCompatImageView, url: String) {
Glide.with(imageView.context).load(url).into(imageView)
}
}
И я получаю эту ошибку
* What went wrong:
Execution failed for task ':app:compileDebugJavaWithJavac'.
> android.databinding.tool.util.LoggedErrorException: Found data binding errors.
****/ data binding error ****msg:Cannot find the setter for attribute 'app:loadImageFromNetwork' with parameter type java.lang.String on android.widget.ImageView.
file:S:\Downloads\ppp\MyApplication\app\src\main\res\layout\car_item_view.xml
loc:26:44 - 26:61
****\ data binding error ****
Есть идеи, что не так?
ИЗМЕНИТЬ У меня также есть это в моем файле gradle.properties
android.useAndroidX=true
android.enableJetifier=true
Вот мой класс автомобилей
data class Car(val id: Int, val plateNumber: String, val location: Location, val model: Model)
data class Model(val id: Int, val title: String, val photoUrl: String)
Это строка, содержащая URL-адрес изображения, который я также пытался жестко запрограммировать, но все равно происходит то же самое.
проблема в том, что ваш метод адаптера привязки находится в объекте, и поэтому его не удалось найти. Поместите его в какой-нибудь класс и используйте этот класс как переменную в xml для привязки.
Я изменил метод адаптера, поэтому теперь он принимает объект Car, и я передаю автомобиль в моем xml, но получаю ту же ошибку.
Удалось ли вам найти решение этой проблемы? У меня такая же проблема в новом проекте, где я также использую библиотеку X.
Вашему компилятору не удалось найти метод loadImageFromNetwork(), потому что он добавлен внутри объект, поэтому рассмотрите возможность размещения его внутри класса, например:
import androidx.appcompat.widget.AppCompatImageView
import androidx.databinding.BindingAdapter
import com.bumptech.glide.Glide
class Bindings {
companion object {
@JvmStatic
@BindingAdapter("loadImageFromNetwork")
fun loadImageFromNetwork(imageView: AppCompatImageView, url: String) {
Glide.with(imageView.context).load(url).into(imageView)
}
}
}
и тебе хорошо идти с этим классом.
Извините, но у меня это не работает. У меня есть другое приложение, в котором я не использую androidx, но поддерживаю lib, и в этом проекте привязки работают должным образом. Вам не кажется, что это ошибка androidx?
Я так не думаю, потому что я уже сделал это с androidx вот так, иначе у вас должна быть другая серьезная проблема, если он не работает.
Попробуй это
class CarViewModel(var car: Car, val context: Context) {
fun getImageCar() = car.model.photoUrl
companion object {
@JvmStatic @BindingAdapter("imageUrl")
fun setImageUrl(imageView: ImageView, url: String) {
Glide.with(imageView.context).load(url).into(imageView)
}
}
}
в вашем XML-файле
<?xml version = "1.0" encoding = "utf-8"?>
<layout xmlns:android = "http://schemas.android.com/apk/res/android" xmlns:tools = "http://schemas.android.com/tools"
xmlns:app = "http://schemas.android.com/apk/res-auto">
<data>
<import type = "android.view.View"/>
<variable name = "carViewModel"
type = "your.package.CarViewModel"/>
</data>
<LinearLayout
android:layout_width = "match_parent"
android:layout_height = "wrap_content">
<ImageView
android:id = "@+id/iv_notice"
android:layout_width = "120dp"
android:layout_height = "120dp"
app:imageUrl = "@{carViewModel.imageNotice}"/>
</LinearLayout>
У меня это работает, вам нужно сначала получить URL-адрес, а затем привязка данных помещает ваш URL-адрес в imageView. Я тоже использую androidX, но не для изображения, а для остальных компонентов
какой у вас
car.model.photoUrlздесь в xml?