Не удается найти установщик для атрибута в привязке данных

Я использую LiveData, DataBinding и Kotlin в своем приложении.

Я определил Binding Adapter для RecyclerView следующим образом:

   class MainListBindings {

    private val TAG = "TasksListBindings"

    companion object {

        @JvmStatic
        @SuppressWarnings("unchecked")
        @BindingAdapter("main_items")
        fun setItems(recyclerView: RecyclerView, items: MutableLiveData<List<Homeitem>>? = null) {

            val adapter: RecyclerMainAdapter = recyclerView.adapter as RecyclerMainAdapter
            //prevent use of null list
            items?.let {

                adapter.swapData(items)
            }
        }

    }
}

и мой reyclerView в XML, назначенный этому привязывающему адаптеру, вот так:

  <android.support.v7.widget.RecyclerView
      android:id="@+id/main_recycler"
      app:main_items="@{viewmodel.items}"
      android:layout_width="match_parent"
      android:layout_height="match_parent"/>

И в моей ViewModel я использовал

val items = MutableLiveData<List<Homeitem>>()

создать список.

Но я получаю эту ошибку при создании приложения:

Found data binding errors.
****/ data binding error ****msg:Cannot find the setter for attribute 'app:main_items' with parameter type android.arch.lifecycle.MutableLiveData<java.util.List<project.data.pojo.Homeitem>> on android.support.v7.widget.RecyclerView. file:/home/user/Yara/bazinama_mag/bazinama/app/src/main/res/layout/fragment_main.xml loc:22:24 - 22:38 ****\ data binding error ****

5 ответов

Причины этой ошибки могут быть разными, но в моем случае проблема возникла из-за того, что я не добавил apply plugin: 'kotlin-kapt' А также apply plugin: 'kotlin-android-extensions' в моем Gradle,

После добавления этих плагинов вы должны заменить annotationProcessors с kapt,

После этого все может пойти хорошо.

Связующий адаптер

    @JvmStatic
    @BindingAdapter("main_items")
    fun setItems(recyclerView: RecyclerView, items: MutableLiveData<List<String>>) {

    }

модель

 class User : ViewModel(){
        lateinit var list: MutableLiveData<List<String>>
    }

Связать данные

 val items = ViewModelProviders.of(this@FragmentName)
                .get(RecyclerViewHelper.User::class.java)
    mBinding!!.user = items

раскладка

<layout>
     <data>
        <variable
            name="user"
            type="com.XXX.view.recylerview.RecyclerViewHelper.User" />
    </data>

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical">

        <android.support.v7.widget.RecyclerView
            android:id="@+id/helper_list"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layoutManager="android.support.v7.widget.LinearLayoutManager"
            app:main_items="@{user.list}" />

    </RelativeLayout>

</layout>

Проверьте, есть ли у вас пробел после значения @BindingAdapter, например: @BindingAdapter("sleepDurationFormatted ") Мне потребовалось 2 часа, чтобы узнать.

Первое связывание данных не поддерживает пользовательские пространства имен, поэтому вам нужно удалить app: из вашего определения:

@BindingAdapter("main_items")

Затем вы должны предоставить правильный тип для установки на адаптер:

app:main_items="@{viewmodel.items.value}"

Или сделайте ручку адаптера MutableLiveData:

@BindingAdapter("main_items")
fun setItems(recyclerView: RecyclerView, items: MutableLiveData<List<Homeitem>>?) {
    val adapter: RecyclerMainAdapter = recyclerView.adapter as RecyclerMainAdapter
    items?.getValue()?.let { adapter.swapData(it) }
}

2023 здесь. Придется рефакторить проект 2021 года.

Моя проблема заключалась в том, что я на самом деле не указывал именно тип виртуальной машины.

XML:

      <TextView
        android:id="@+id/location"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_margin="12dp"
        android:ellipsize="end"
        android:lines="1"
        android:maxLines="1"
        android:text="@{viewModel.location}”

И ВМ:

          val location = session.location?.toLongString()

Исправим это с помощью:

          val location: CharSequence = session.location?.toLongString() ?:""
Другие вопросы по тегам