Привязка данных Android и LiveData: невозможно привязать значение в свойстве LiveData

Я пробую привязку данных для представления, которое должно отображать данные, представленные через свойство LiveData в модели представления, но я не нашел способа привязать объект внутри LiveData к представлению. Из XML у меня есть доступ только к свойству value экземпляра LiveData, но не к объекту внутри него. Я что-то упускаю или это невозможно?

Моя модель просмотра:

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?)

person Bohsen    schedule 14.11.2018    source источник
comment
почему вы используете двустороннюю привязку для TextView   -  person Abraham Mathew    schedule 16.11.2018
comment
Потому что я хочу сохранять изменения, внесенные в задачу, всякий раз, когда пользователь вносит изменения в задачу в пользовательском интерфейсе.   -  person Bohsen    schedule 16.11.2018
comment
Тогда у вас есть проблема с тем, что task в любом случае не может быть изменен.   -  person tynn    schedule 16.11.2018
comment
@tynn Будет ли это работать, только если задача изменяема?   -  person Bohsen    schedule 17.11.2018
comment
вы должны наблюдать за своей переменной данных в реальном времени внутри фрагмента, чтобы получить изменения   -  person Abraham Mathew    schedule 21.11.2018


Ответы (2)


почему вы используете двустороннюю привязку для TextView android:text="@={viewmodel.task.value}" вместо этого android:text="@{viewmodel.task.title}"

person Abraham Mathew    schedule 16.11.2018
comment
Не решает мою проблему. По-прежнему не могу получить доступ к полям моей задачи. - person Bohsen; 16.11.2018
comment
используйте некоторые значения внутри модели задачи вместо всего значения, например android: text = @ {viewmodel.task.title} - person Abraham Mathew; 21.11.2018
comment
Это наконец сработало после некоторых настроек. Также люди должны знать, что автозавершение кода IntelliJ может создать проблемы, поскольку оно не предлагает предложений для полей объекта liveata. - person Bohsen; 30.01.2019

Чтобы LiveData работал с привязкой данных Android, необходимо установить LifecycleOwner для привязки

binding.setLifecycleOwner(this)

и используйте LiveData, как если бы это был ObservableField

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

Чтобы это работало, Task необходимо реализовать CharSequence. Использование viewmodel.task.toString() также может работать. Чтобы реализовать двустороннюю привязку, вам придется вместо этого использовать MutableLiveData.

person tynn    schedule 16.11.2018
comment
Но Task - это не просто строка. Задача - это полноценный объект с множеством свойств. Я понимаю, что можно привязать строки, логические значения, целые числа и т. Д. Непосредственно внутри LiveData, но тогда модель просмотра будет покрыта полями liveata. Я думал, что привязка данных была более зрелой и могла бы привязаться к свойствам объекта внутри объекта LiveData. Я собираюсь добавить свой класс Task к своему вопросу. - person Bohsen; 17.11.2018
comment
У меня уже есть binding.setLifecycleOwner(viewLifecycleOwner), так как это внутри фрагмента. - person Bohsen; 17.11.2018
comment
ЭТО ПРАВО ЗДЕСЬ. Вау, я уже 30 минут пытаюсь исправить. Спасибо - person Scott Driggers; 16.01.2021