Привязка данных Android не работает с androidX

Я пробую новую библиотеку 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)

какой у вас car.model.photoUrl здесь в xml?

Jeel Vankhede 05.10.2018 13:35

Это строка, содержащая URL-адрес изображения, который я также пытался жестко запрограммировать, но все равно происходит то же самое.

David 05.10.2018 13:38

проблема в том, что ваш метод адаптера привязки находится в объекте, и поэтому его не удалось найти. Поместите его в какой-нибудь класс и используйте этот класс как переменную в xml для привязки.

Jeel Vankhede 05.10.2018 13:40

Я изменил метод адаптера, поэтому теперь он принимает объект Car, и я передаю автомобиль в моем xml, но получаю ту же ошибку.

David 05.10.2018 13:43

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

M3-n50 21.12.2018 09:37
1
5
1 106
2

Ответы 2

Вашему компилятору не удалось найти метод 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?

David 05.10.2018 13:58

Я так не думаю, потому что я уже сделал это с androidx вот так, иначе у вас должна быть другая серьезная проблема, если он не работает.

Jeel Vankhede 05.10.2018 14:00

Попробуй это

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, но не для изображения, а для остальных компонентов

Другие вопросы по теме