【问题标题】:Android ViewModel observer does not work? KotlinAndroid ViewModel 观察者不起作用?科特林
【发布时间】: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


【解决方案1】:

观察者只观察你是否调用了 MutableLiveData 的 setValue() 或 postValue() 方法

您在哪里调用 serverSetLiveData 的 setValue() 或 postValue() 函数。 例如。 serverSetLiveData.setValue(serverList) 或 serverSetLiveData.postValue(serverList)。在代码中。

【讨论】:

  • ServerSetVM.add() 在 Fragment 中调用 ViewModel 类中的 serverSetLiveData.value!!.add()。由于 Kotlin 中没有 setValue()postValue() 方法,也许我应该使用“=”运算符而不是 add() 来更新 serverSetLiveData.value
  • 是的,kotlin 将 setValue() 和 getValue() 替换为 value。如果您使用类似 serverSetLiveData.value=serverList。意味着您正在使用 setValue() 并且如果您使用类似 serverSetLiveData.value。表示您正在使用 getValue()。是的,kotlin 中存在 postValue() 函数
  • 要使用 livedata,您必须在 viewModel() 中使用 livedata.valuelivedata.postValue(),包括在您的列表进行一些更新时。执行“livedata.value.list.add('new Item)”时不会触发实时数据,您必须为实时数据设置值才能触发它。 livedata.value = newList 类似的东西。
  • @Black4Guy 谢谢。 “=”运算符工作。如果您编辑 Kotlin 的答案并且我接受它会很好。顺便说一句,即使我进入了Observer Lambda,recyclerView 适配器也没有更新。你为什么这么认为?
  • setValue 在 Java 中与 .value = 在 Kotlin 中相同,请参阅属性访问器的互操作指南。
【解决方案2】:

只有当你调用.value = 时才会触发Obervre

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-22
    • 2020-07-21
    相关资源
    最近更新 更多