如何解决如何将 LiveData 应用于 xxxFragment.class 而不是 XML
如何将实时数据isRefreshing应用于swiperefreshLayout.isRefresh
?
var isRefreshing = mutablelivedata<Boolean>()
fun refresh() {
viewmodelScope.launch(dispatchers.Main) {
isRefreshing.value = true
withContext(dispatchers.IO) {
fun doInBackground() // takes a long time
}
isRefreshing.value = false
}
}
xxxFragment.class
中的代码:
binding.swiperefreshLayout.setonRefreshListener {
xxxviewmodel.refresh()
}
// error here,require Boolean,found mutablelivedata<Boolean>
binding.swiperefreshLayout.isRefreshing = xxxviewmodel.isRefreshing
通常我将实时数据应用到 XML 中,如下所示,但我在 XML 中找不到 swiperefreshlayout.isRefreshing
。
<androidx.swiperefreshlayout.widget.SwipeRefreshLayout
android:id="@+id/swiperefresh_layout"
android:layout_width="match_parent"
android:layout_height="0dp"
isFreshing = "@{xxxviewmodel.isRefreshing}">
解决方法
您所做的是获取 liveData "isRefreshing" 的当前值。 (您还需要添加 .value 以获取与 liveData 关联的基础值)
binding.swiperefreshLayout.isRefreshing = xxxViewModel.isRefreshing.value?:false
相反,您应该在初始化视图模型后观察实时数据的变化。
xxxViewModel.apply {
isRefreshing.observe(viewLifecycleOwner){
binding.swiperefreshLayout.isRefreshing = it
}
//... observe the rest of your LiveData
}
编辑:
你可以创建一个像下面这样的函数
private inline fun <T> doObserve(ld: LiveData<T>,crossinline callback: (T) -> Unit) {
ld.observe(viewLifecycleOwner,{ callback.invoke(it) })
}
然后直接调用
xxxViewModel.apply {
doObserve( isRefreshing){
binding.swiperefreshLayout.isRefreshing = it
}
//... observe the rest of your LiveData
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。