【发布时间】:2020-03-05 08:45:29
【问题描述】:
在选项卡式活动的片段内:
override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
serverSetVM = ViewModelProvider(activity!!).get(ServersViewModel::class.java)
serverList = ArrayList(serverSetVM.get())
rv = rv_serverList // findViewById
rv.layoutManager = LinearLayoutManager(context)
rv.adapter = ServerListRevAdapter(context!! ,serverList)
serverSetVM.serverSetLiveData.observe(viewLifecycleOwner, Observer {
Log.v ("MainAct", "Inside OBSERVER")
serverList = ArrayList(serverSetVM.get())
rv.adapter!!.notifyDataSetChanged()
})
}
还有;
val serverSetLiveData = MutableLiveData<HashSet<Server>>() // Inside ViewModel class
observe() 功能似乎不起作用。当ServerSetVM的值在同一个片段内被修改(通过ViewModel类中定义的函数,即add()),recyclerView不会更新。根据 Logcat 输出,Observer lambda 仅在 onCreateView() 之后被调用。
我确认 MutableLiveData 已更新,但未调用 Observer{} lambda。我需要纠正我对 ViewModel 的看法吗?
编辑(解决方案):
使用“=”运算符修改 MutableLiveData 值,以便观察者可以检测到它。即使serverSetLiveData.value=serverSetLiveData.value 也能胜任。
【问题讨论】:
-
这仅在
serverSetVM是可变列表时才有效,它不应该是。应该使用adapter.setItems(list)或类似的东西。 -
“应该使用
adapter.setItems(list)或类似的东西”是什么意思?
标签: android kotlin observable android-livedata android-viewmodel