Не удается найти установщик для атрибута в привязке данных
Я использую 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() ?:""