如何将实时数据isRefreshing应用于swiperefreshLayout.isRefresh
?
xxxViewModel.class
:中的代码
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
}