如何将LiveData应用于xxxFragment.class而不是XML



如何将实时数据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
} 

最新更新