微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决如何将 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
} 

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。