Как предотвратить возвращение нулевого значения liveata адаптеру привязки? - PullRequest
2 голосов
/ 21 апреля 2019

В моем макете 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 > , я написал адаптер привязки для привязки списка, возвращенного этим методом, к счетчику

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

    }

но мой метод забавный setSourceData (spinner: Spinner, sourceList: List?) sourceList всегда получает нулевое значение, я просто запутался, почему liveata возвращает нулевое значение в адаптер привязки, если я наблюдаю ту же модель представления метод с в действии, то я могу видеть элементы, но с помощью привязки данных я могу получить только нулевые значения для моего адаптера привязки

...