我使用自定义数据类在我的ViewModel像这样
class MainViewModel(val initialvalue:MainModel): ViewModel() {
var countLiveData: MutableLiveData<MainModel>
init {
countLiveData = MutableLiveData<MainModel>()
countLiveData.value = MainModel("hi","hm")
}
fun increment(){
countLiveData.value?.two = countLiveData.value?.two + " Br"
}
}
这是数据类
data class MainModel(var one:String?, var two:String?)
这是主要活动
class MainActivity : AppCompatActivity() {
lateinit var mainViewModel: MainViewModel
lateinit var binding: ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
binding = DataBindingUtil.setContentView(this, R.layout.activity_main)
// 2. add viewModel
mainViewModel = ViewModelProvider(this, MainViewModelFactory(MainModel("One String","String Two"))).get(MainViewModel::class.java)
binding.lifecycleOwner = this
binding.datamodel = mainViewModel
// 1. add life cycle observer
lifecycle.addObserver(MainObserver())
}
}
但问题是,当我使用editext改变变量数据"一"one_answers"二"时,实时变化并没有反映出来?
感谢当你修改MainModel时,实时数据不知道它,不发送通知。要发送通知,必须更改countLiveData.value.
试试这样
fun increment(){
val value = countLiveData.value!!
countLiveData.value = value.copy(two = value.two + " Br")
}
但问题是,当我使用editext改变变量数据'一'和'二'时,实时变化没有反映出来?
为了在绑定到edittext时获得更新的值,值本身需要是可观察类型(如LiveData
)。
现在one
和two
只是普通的Strings
-改变它们的值不会通知Databinding
它们需要被反弹到UI。
你的ViewModel
不应该有一个嵌套的视图模型来保存数据-你的ViewModel
应该公开DataBinding
可以观察和更新的可观察数据:
class MainViewModel(val initialvalue:MainModel): ViewModel() {
//var countLiveData: MutableLiveData<MainModel>
var oneLiveData: MutableLiveData<String>()
var twoLiveData: MutableLiveData<String>()
init {
//countLiveData = MutableLiveData<MainModel>()
//countLiveData.value = MainModel("hi","hm")
oneLiveData.value = "hi"
twoLiveData.value = "hm"
}
fun increment(){
//countLiveData.value?.two = countLiveData.value?.two + " Br"
twoLiveData.value = twoLiveData.value + " Br"
}
}
如果你想保留嵌套的"MainModel"由于某些原因,它的属性必须是可观察类型。
data class MainModel(var one:MutableLiveData<String>, var two:MutableLiveData<String>)