数据绑定到 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
中,我创建了 Customer
的 MutableList
:
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 不应具有可修改的属性,因为这使得每个人都可以对其进行编辑,但无法保证保存更改。但那是另外一回事了。
我有一个 activity 应该显示非固定数量的片段。每个片段将接收 Customer
的 MutableList 的一个元素,它需要将其组件绑定到此 Customer
class.
我创建了这样的 class:
class Customer constructor(
val name: LiveData<String>
val email: LiveData<String>
)
在我的 ViewModel
中,我创建了 Customer
的 MutableList
:
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 不应具有可修改的属性,因为这使得每个人都可以对其进行编辑,但无法保证保存更改。但那是另外一回事了。