如何解决Transformations.switchMap只能运行一次,或者根本无法运行
我正在寻找有关Transformations.switchMap的帮助。我莫名其妙地无法使它正常工作,并开始怀疑我是否真正理解正确。
根据我的理解,第一个参数就像一个触发器,只要其值发生变化,第二个参数/函数将被映射/调用以返回一个新的/修改后的liveData对象。 就我而言,我有:
#MainActivity
viewModel.repository.items.observe(requireActivity(),Observer { weight -> weight?.let { adapter!!.setItems(it) } })
#ViewModel
lateinit var items: LiveData<List<Weight>> # Used in my RecyclerView
var filterChanged = MutableLiveData<Long>(0L) # The "trigger" value
override fun init() {
super.init()
items = Transformations.switchMap(filterChanged) {repository.getItems(0L,filterEnd)}
}
repository.getItems()返回一个由filterEnd(SQL ...其中时间戳
这有效!但是在片段初始化期间只有一次。片段初始化之后,我可以根据需要多次更改filterChanged触发变量, 不会再次调用repository.getItems()函数(为filterEnd应用更新的值)。
它需要启动/停止辅助活动(设置或大约),这将重新创建viewModel以更新过滤器值。
我看到了几种使用lambda,一个或两个参数等等来制作Transformations.switchMap语句的方法,但是我要么无法使它们编译,要么它们没有按我的预期进行操作。
现在,我是否正确理解了它应该如何工作?知道我做错了什么吗?
编辑:添加了存储库部分以澄清内容:
#Repository
items = getItems(filterStart,filterEnd) # This is where I enter from the ViewModel
// This function redirects to the actual dao functions,fun getItems(filterStart: Long,filterEnd: Long): LiveData<List<Weight>> {
Log.d("Repository ","getItems: $filterStart,$filterEnd")
if ((filterStart != 0L) && (filterEnd == 0L)) return dao.getItemsGreaterThan(filterStart)
else if ((filterStart == 0L) && (filterEnd != 0L)) return dao.getItemsLessThan(filterEnd)
else if ((filterStart != 0L) && (filterEnd != 0L)) return dao.getItemsRange(filterStart,filterEnd)
else return dao.getItems()
}
有一次我简化了事情并直接调用dao函数,就像这样:
items = dao.getItemsLessThan(filterEnd)
甚至完全绕开了存储库并直接从ViewModel调用了相应的dao函数,但这也没有任何区别。 然后有相应的dao函数,如下所示:
@Query("SELECT * from weight WHERE timestamp >=:start ORDER BY timestamp DESC")
abstract fun getItemsGreaterThan(start: Long): LiveData<List<Weight>>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。