Как предотвратить возврат livedata null в адаптер привязки?

#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. пространство имен приложения будет автоматически игнорироваться обработчиком аннотаций