首页 > 解决方案 > 如何防止 livedata 返回 null 到绑定适配器?

问题描述

我的 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<List<Source>>类型的变量,我编写了一个绑定适配器将该方法返回的列表绑定到微调器

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

    }

但是我的方法 fun setSourceData(spinner: Spinner, sourceList: List?) sourceList 总是收到 null 值,我只是很困惑为什么 livedata 返回 null 到绑定适配器,如果我在活动中观察到相同的 viewmodel 方法,那么我可以看到项目,但使用数据绑定我只能获取空值到我的绑定适配器

标签: androidkotlinandroid-databinding

解决方案


推荐阅读