在数据绑定中找不到属性的setter

问题描述 投票:0回答:4

我在我的应用程序中使用 LiveData、DataBinding 和 Kotlin。

我为 RecyclerView 定义了一个 Binding Adapter,如下所示:

   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 ****
android data-binding kotlin android-livedata
4个回答
47
投票

此错误可能有不同的原因,但就我而言,问题的出现是因为我没有在我的

apply plugin: 'kotlin-kapt'
中添加
apply plugin: 'kotlin-android-extensions'
Gradle

添加这些插件后,您必须将

annotationProcessors
替换为
kapt

在那之后,一切可能都会顺利。


6
投票

绑定适配器

    @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>

1
投票

检查

@BindingAdapter
值后面是否有空格,如下所示:

@BindingAdapter("sleepDurationFormatted ")
                                       ^
                                       |
                                      here

我花了2个小时才找到答案。


0
投票

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() ?:""
© www.soinside.com 2019 - 2024. All rights reserved.