我想设置一个基本ViewModel
并存储一个ArrayList
可以更新并因此观察的,将其存储为LiveData
.
问题是 ViewModel 附加的 Fragment 在调用它时似乎无法检测到我的 ArrayList 中的更改.observe
。虽然当我调试应用程序时,我可以看到 ArrayList - 称为s2
- 确实已更新。
这是我的视图模型:
class MainViewModel : ViewModel() {
private val _s1 = MutableLiveData<String>()
private val _s2 = MutableLiveData<ArrayList<String>>()
val s1: LiveData<String>
get() = _s1
val s2: LiveData<ArrayList<String>>
get() = _s2
init {
_s1.value = "HELLO WORLD"
_s2.value = arrayListOf("")
}
fun populateList() {
_s2.value?.clear()
for (i in 10 downTo 1) {
_s2.value?.add("$i bottles")
}
}
}
和附加的片段:
class MainFragment : Fragment() {
companion object {
fun newInstance() = MainFragment()
}
private lateinit var viewModel: MainViewModel
private var message2TV: TextView? = null
// ...
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
viewModel = ViewModelProviders.of(this).get(MainViewModel::class.java)
message2TV = view?.findViewById(R.id.message_2)
viewModel.s1.observe(this, Observer {
view?.findViewById<TextView>(R.id.message)?.text = it
})
viewModel.s2.observe(this, Observer {
if (it != null && it.isNotEmpty()) {
message2TV?.text = ""
it.forEach { item -> message2TV?.append("\n$item") }
}
})
message2TV?.setOnClickListener {
viewModel.populateList()
}
}
}
当我调试时,我还发现viewModel.s2.observe()
在单击视图(并更新了 ArrayList)之后,它不再被调用。只有当我改变屏幕方向时,我才能让它显示列表。
请问,我在这里错过了什么?