Android 数据绑定(bind)和 LiveData : Can't bind to value in LiveData property

标签 android android-databinding android-livedata android-viewmodel

我正在尝试对一个 View 进行数据绑定(bind),该 View 应该显示通过 View 模型中的 LiveData 属性公开的数据,但我发现无法将 LiveData 内的对象绑定(bind)到 View 。从 XML 我只能访问 LiveData 实例的 value 属性,但不能访问其中的对象。我错过了什么还是不可能?

我的 View 模型:

class TaskViewModel @Inject
internal constructor(private val taskInteractor: taskInteractor)
    : ViewModel(), TaskContract.ViewModel {

    override val selected = MutableLiveData<Task>()
    val task: LiveData<Task> = Transformations.switchMap(
        selected
    ) { item ->
        taskInteractor
            .getTaskLiveData(item.task.UID)
    }
    ... left out for breivety ... 
}

我试图在我的 View 中绑定(bind)任务对象的值,但是当试图在我的 View 中设置我的任务的值时,我只能做 android:text="@={viewmodel.task.value}" .我无权访问我的任务对象的字段。在 LiveData 对象中提取对象值的技巧是什么?

我的任务类:
@Entity(tableName = "tasks")
data class Task(val id: String, 
                val title: String, 
                val description: String?, 
                created: Date, 
                updated: Date, 
                assigned: String?)

最佳答案

对于 LiveData要使用 Android 数据绑定(bind),您必须设置 LifecycleOwner用于绑定(bind)

binding.setLifecycleOwner(this)

并使用 LiveData好像是 ObservableField
android:text="@{viewmodel.task}"

为此,Task需要执行CharSequence .使用 viewmodel.task.toString()可能也有效。要实现双向绑定(bind),您必须使用 MutableLiveData反而。

关于Android 数据绑定(bind)和 LiveData : Can't bind to value in LiveData property,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53308863/

相关文章:

android - 当虚拟键盘出现在 native react 中时如何自动向上滚动屏幕(在android上)

android - 如何创建发出单个事件并仅通知最后订阅的观察者的 LiveData?

android - 房间插入POJO列表并在Recyclerview中检索

android - 将 LiveData 转换为 MutableLiveData

Android onSearchRequested() 回调到调用 Activity

android - App.Fragment 和 V4.support.fragment 中的 map

java - 检查java中的JSON对象

Android Databinding xml重复属性

android - 不能在两个不同的 View 上使用相同的 BindingAdapter

android - 通知 ViewModel 模型更新?