【问题标题】:Android databinding and LiveData: Can't bind to value in LiveData propertyAndroid 数据绑定和 LiveData:无法绑定到 LiveData 属性中的值
【发布时间】:2018-11-14 21:18:22
【问题描述】:

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

我的视图模型:

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 ... 
}

我正在尝试在我的视图中绑定任务对象的值,但是当尝试在我的视图中设置我的任务的值时,我只能执行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?)

【问题讨论】:

  • 为什么要为 TextView 使用两种方式绑定
  • 因为我想保存对任务所做的更改,只要用户在 UI 中对任务进行更改。
  • 那么你有一个问题,task 在任何情况下都不可变。
  • @tynn 只有在任务可变的情况下才有效?
  • 您必须观察片段内的实时数据变量才能获得更改

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


【解决方案1】:

要使LiveDataAndroid 数据绑定 一起使用,您必须为绑定设置LifecycleOwner

binding.setLifecycleOwner(this)

并像使用ObservableField 一样使用LiveData

android:text="@{viewmodel.task}"

为此,Task 需要实现 CharSequence。使用viewmodel.task.toString() 也可以。要实现双向绑定,您必须改用MutableLiveData

【讨论】:

  • 但是 Task 不仅仅是一个字符串。任务是具有多个属性的完整对象。我知道可以直接在 LiveData 内绑定到字符串、布尔值、整数等,但随后视图模型将被 livedata 字段覆盖。我认为数据绑定更成熟,并且能够绑定到 LiveData 对象内对象的属性。我要将我的任务类添加到我的问题中。
  • 我已经有了binding.setLifecycleOwner(viewLifecycleOwner),因为它在片段中。
  • 就在这里。哇,我一直在尝试修复 30 分钟。谢谢
【解决方案2】:

为什么你对 TextView 使用两种方式绑定 android:text="@={viewmodel.task.value}" 而是像这样使用android:text="@{viewmodel.task.title}"

【讨论】:

  • 不能解决我的问题。仍然无法访问我的任务的字段。
  • 请在任务模型中使用一些值而不是整个值,即 android:text="@{viewmodel.task.title}"
  • 经过一些调整后终于奏效了。人们还应该意识到 IntelliJ 代码完成可能会产生问题,因为它不会为 livedata 对象的字段提供建议。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-22
  • 2018-09-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多