#android #kotlin #android-databinding
#Android #kotlin #android-привязка данных
Вопрос:
В моем XML-макете есть счетчик, который устанавливает атрибут с именем SourceData
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<import type="com.lionosur.dailyexpenses.database.Entity.Source"/>
<import type="java.util.List"/>
<import type="android.arch.lifecycle.LiveData"/>
<variable name="createExpenseViewModel" type="com.lionosur.dailyexpenses.viewModels.MainViewModel"/>
</data>
<Spinner
android:layout_width="0dp"
android:layout_height="wrap_content"
android:id="@ id/expense_category"
app:sourceData="@{createExpenseViewModel.getAllSourceItems(1)}"
app:layout_constraintStart_toStartOf="@ id/textView"
android:layout_marginTop="20dp"
app:layout_constraintTop_toBottomOf="@ id/textView" app:layout_constraintWidth_percent="0.7"
/>
метод createExpenseViewModel.getAllSourceItems(1) возвращает переменную типа LiveData<Список<Источник>> , я написал адаптер привязки для привязки списка, возвращаемого этим методом, к spinner
class AddExpenseAdapter {
companion object {
@JvmStatic
@BindingAdapter("app:sourceData")
fun setSourceData(spinner: Spinner, sourceList: List<Source>?) {
val categoryItems = ArrayList<String>()
if (sourceList != null) {
categoryItems.addAll(sourceList.map { it.sourceName })
}
val spinnerAdapter =
ArrayAdapter<String>(spinner.context, android.R.layout.simple_spinner_dropdown_item, categoryItems)
spinner.adapter = spinnerAdapter
}
}
}
я реализовал привязку в своей деятельности следующим образом
lateinit var binding: ActivityCreateExpenseBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
supportActionBar?.setDisplayHomeAsUpEnabled(true)
supportActionBar?.setDisplayShowHomeEnabled(true)
binding = DataBindingUtil.setContentView(this, R.layout.activity_create_expense)
val mainViewModel = DaggerExpenseComponent.builder()
.setContext(this)
.build()
.getExpenseViewModel()
binding.setLifecycleOwner(this)
binding.createExpenseViewModel = mainViewModel
}
но мой метод забавно устанавливает SourceData(spinner: Spinner, SourceList: List?)SourceList всегда получает значение null, я просто не понимаю, почему livedata возвращает null в адаптер привязки, если я наблюдаю тот же метод viewmodel с помощью действия, тогда я могу видеть элементы, но, используя привязку данных, я могу получать только нулевые значения для моего адаптера привязки
Комментарии:
1. Я не уверен в этом, но не могли бы вы попробовать изменить, чтобы также изменить в том же файле
sourceList: List<Source>?
sourceList: LiveData<List<Source>>?
app:sourceData
sourceData
2. это тоже не сработало
3. пространство имен приложения будет автоматически игнорироваться обработчиком аннотаций