Привязка данных к объектам сложного типа в MutableList - PullRequest
0 голосов
/ 27 сентября 2018

У меня есть действие, которое должно отображать нефиксированное количество фрагментов.Каждый фрагмент получит элемент MutableList Customer, и его компоненты должны быть связаны со свойством в этом Customer классе.

Я создал класс следующим образом:

class Customer constructor(
    val name: LiveData<String>
    val email: LiveData<String>
)

В моем ViewModel я создал MutableList из Customer:

class CustomerViewModel: ViewModel() {

    val customers: MutableList<Customer> = mutableListOf()
}

Затем я динамически создаю фрагменты:

for (i in 0..customerCount) {
  val fragment = FragmentCustomer.newInstance(viewModel.customers.get(i))
  supportFragmentManager.beginTransaction()
    .add(R.id.fragmentContainer, fragment, "FragmentCustomer_$i")
    .commit()
}

Заказчикэкземпляр хранится в переменной во фрагменте, а затем я делаю DataBindingUtil.inflate:

var binding: FragmentCustomerBinding = DataBindingUtil.inflate(inflater, R.layout.fragment_customer, container, false)
var view = binding.root

binding.model = palavra
return view

и в макете фрагмента:

<EditText
    android:id="@+id/nameTextView"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    android:text="@{model.name}"
    android:onTextChanged="@={model.name}" />

Это вызывает ****/ data binding error ****msg:The expression modelName.getValue() cannot be inverted: There is no inverse for method getValue, you must add an @InverseMethod annotation to the method to indicate which method should be used when using it in two-way binding expressions.

Как я могу это исправить?И еще один «бонусный» вопрос: нужно ли мне сохранять содержимое просмотра с помощью saveState для таких событий, как onDestroy, или ViewModel справится с этим для меня?

1 Ответ

0 голосов
/ 27 сентября 2018

Для вашего первого вопроса значения должны быть типов MutableLiveData, а не просто LiveData, в противном случае не будет выставлено никакого установщика:

class Customer constructor(
    val name: MutableLiveData<String>
    val email: MutableLiveData<String>
)

Не забудьте установить владельца жизненного цикла для привязки после надуванияэто потому, что в противном случае представление не будет обновлено при изменении данных.

Для вашего дополнительного вопроса: вы должны хранить ViewModel как переменную в вашем фрагменте.Это гарантирует, что он сохранит данные, когда представление будет уничтожено, но фрагмент будет сохранен.После уничтожения экземпляры действующих данных будут очищены, поскольку они знают о жизненном цикле, который вы указали для привязки.

Оптимально, класс Customer не должен иметь изменяемых свойств, потому что это делает его редактируемым для всех, безгарантия сохранения изменений.Но это другая история.

...