JetPack LiveData的使用

345 阅读1分钟

背景

最近在学习JetPack系列组件,顺便记录下LiveData的使用,其中相关概念的性东西不再介绍,需了解相关知识点请查看其他博客,本篇文章旨在记录LiveData使用,大佬请忽略。

1.创建ViewModel类

下面就以星级服务打分操做为实例进行讲解 首先我们需要创建StartViewModel,并且继承与ViewModel方法,代码如下

class StartViewModel :ViewModel(){

   private  var liveData:MutableLiveData<List<StartBean>>?=null

   fun   getDataBean():LiveData<List<StartBean>>{
           if(liveData==null){
               liveData= MutableLiveData()
               loadData()
           }

       return liveData as MutableLiveData<List<StartBean>>
   }
   fun  loadData(){
       val girls: MutableList<StartBean> = ArrayList()
       girls.add(StartBean("一星", " * "))
       girls.add(StartBean("二星", " **  "))
       girls.add(StartBean("三星", " *** "))
       girls.add(StartBean("四星", " **** "))
       girls.add(StartBean("五星", " ***** "))
       liveData?.postValue(girls)
   }

  //提供一个方法来改变数据
   fun changeValue(i: Int,  start:String, level:String) {
       val value = liveData?.value
       
       value?.get(i)?.level= level
       value?.get(i)?.start= start
       liveData?.postValue(value)
   }
}

其中实现了数据添加通知以及数据更新通知的实例,体现LiveData的方便之处,减少了我们以前写代码时候必须要实现方法的回调才能更新。

startBean类

class  StartBean constructor(var start:String,
                             var level:String) {


}

2.MainActivity类实现

1.实例化StartViewModel
private val MainActivity.startViewModel: StartViewModel
 get() {
     val myNameViewModel = ViewModelProviders.of(this).get(StartViewModel::class.java)
     return myNameViewModel
 }

2.订阅/监听ViewModel数据更新状态

startViewModel.getDataBean().observe(this,  {
    //循环遍历
    for ( i:Int in 0 .. it.size-1){
        Log.e("result",it.get(i).start+","+it.get(i).level)
    }

}
)

更新集合数据

//通过btn方法调用

   fun update(view: View) {
   startViewModel.changeValue(1,"五星","*****")

}

3.效果

image.png

image.png

就这样,liveData作为一个双向绑定变量数据就这样完成了,现在越来越方便了,如果你会vue,你会发现它们之间有很多的相同点了。