網(wǎng)站首頁 編程語言 正文
LiveData是Jetpack提供的一種響應(yīng)式編程組件,它可以包含任何類型的數(shù)據(jù),并在數(shù)據(jù)發(fā)生變化的時(shí)候通知給觀察者。也就是說,我們可以將數(shù)據(jù)使用LiveData來包裝,然后在Activity中去觀察它,就可以主動將數(shù)據(jù)變化通知給Activity了。
1.簡單使用
class MainViewModel(countReserved:Int) : ViewModel() {
/*當(dāng)外部調(diào)用counter變量時(shí),實(shí)際上獲得的就是_counter的實(shí)例,但是無法給counter設(shè)置數(shù)據(jù),從而保證了ViewModel的數(shù)據(jù)的封裝性。*/
val counter:LiveData<Int>
get()=_counter
private val _counter = MutableLiveData<Int>()
init{
_counter.value=countReserved
}
fun plusOne() {
val count = _counter.value ?: 0
_counter.value = count + 1
}
fun clear() {
_counter.value = 0
}
}
class MainActivity : AppCompatActivity() {
…
override fun onCreate(savedInstanceState: Bundle?) {
…
plusOneBtn.setOnClickListener {
viewModel.plusOne()
}
clearBtn.setOnClickListener {
viewModel.clear()
}
viewModel.counter.observe(this, Observer { count ->
infoText.text = count.toString() // 將最新數(shù)據(jù)更新到界面上
})
}
}
2.map和switchMap
LiveData為了能夠應(yīng)對各種不同的需求場景,提供了兩種轉(zhuǎn)換方法:map()和switchMap()方法。
map()方法的作用就是將實(shí)際包含數(shù)據(jù)的LiveData和僅用于觀察數(shù)據(jù)的LiveData進(jìn)行轉(zhuǎn)換。
比如說有一個(gè)User類,User中包含用戶的姓名和年齡
data class User(var firstName:String,var lastName:String,var age:Int)
map()方法可以將User類型的LiveData自由地轉(zhuǎn)型成任意其他類型地LiveData。
class MainViewModel(countReserved:Int) : ViewModel() {
private val userLiveData = MutableLiveData<User>()
val userName:LiveData<String>=Transformations.map(userLiveData){user->
"${user.firstName} ${user.lastName}"
}
}
如果ViewModel中的某個(gè)LiveData對象時(shí)調(diào)用另外的方法獲取的,那么我們就可以借助switchMap()方法,將這個(gè)LiveData對象轉(zhuǎn)換成另一個(gè)可觀察的LiveData對象。
新建Repository單例類
object Repository{
fun getUser(userId:String):LiveData<User>{
val liveData=MutableLiveData<User>()
liveData.value=User(userId,userId,0)
return liveData
}
}
class MainViewModel(countReserved:Int) : ViewModel() {
private val userLiveData = MutableLiveData<User>()
val user:LiveData<User>=Transformations.SwitchMap(userIdLiveData){userId->
Repository.getUser(userId)
}
fun getUser(userId:String){
userIdLiveData.value=userId
}
}
原文鏈接:https://blog.csdn.net/weixin_63357306/article/details/127187563
相關(guān)推薦
- 2022-04-09 SpringBoot 動態(tài)過濾自動配置類
- 2022-11-21 基于C++實(shí)現(xiàn)一個(gè)日期計(jì)算器_C 語言
- 2022-07-18 RLS遞歸最小二乘法(Recursive Least Squares)
- 2022-10-26 一文解析?Golang?sync.Once?用法及原理_Golang
- 2022-09-21 Android開發(fā)之AAR文件的生成與使用步驟_Android
- 2023-02-06 一文帶你了解Go語言fmt標(biāo)準(zhǔn)庫輸出函數(shù)的使用_Golang
- 2022-11-14 Hive DQL及優(yōu)化
- 2023-06-17 Python利用plotly繪制正二十面體詳解_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡單動態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支