数据绑定到 MutableList 中复杂类型的对象

Data binding to objects of a complex type in an MutableList

我有一个 activity 应该显示非固定数量的片段。每个片段将接收 Customer 的 MutableList 的一个元素,它需要将其组件绑定到此 Customer class.

中的 属性

我创建了这样的 class:

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

在我的 ViewModel 中,我创建了 CustomerMutableList:

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

在 Fragment 的布局中:

<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

我该如何解决这个问题?还有一个 "bonus" 问题,我是否仍然需要在 onDestroy 之类的事件上使用 savedState 来存储视图内容,或者 ViewModel 会为我处理?

对于你的第一个问题,值应该是 MutableLiveData 类型,而不仅仅是 LiveData,否则不会 setter 暴露:

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

不要忘记在绑定后设置生命周期所有者,否则数据更改时视图将不会更新。

对于您的奖励问题:您应该将 ViewModel 作为变量存储在您的片段中。这确保它在销毁视图时保留数据,但保留片段。 销毁后,实时数据实例将被清理,因为它们知道您提供给绑定的生命周期。

最理想的情况是,客户 class 不应具有可修改的属性,因为这使得每个人都可以对其进行编辑,但无法保证保存更改。但那是另外一回事了。