Android Databinding не работает с androidX - PullRequest
0 голосов
/ 05 октября 2018

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

Ответы [ 2 ]

0 голосов
/ 12 декабря 2018

Попробуйте это

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

0 голосов
/ 05 октября 2018

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

, и все готовос этим классом.

...