Android开发中用Kotlin编写LiveData组件教程
LiveData是Jetpack提供的一种响应式编程组件,它可以包含任何类型的数据,并在数据发生变化的时候通知给观察者。也就是说,我们可以将数据使用LiveData来包装,然后在Activity中去观察它,就可以主动将数据变化通知给Activity了。
1.简单使用
class MainViewModel(countReserved:Int) : ViewModel() { /*当外部调用counter变量时,实际上获得的就是_counter的实例,但是无法给counter设置数据,从而保证了ViewModel的数据的封装性。*/ 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() // 将最新数据更新到界面上 }) } }
2.map和switchMap
LiveData为了能够应对各种不同的需求场景,提供了两种转换方法:map()和switchMap()方法。
map()方法的作用就是将实际包含数据的LiveData和仅用于观察数据的LiveData进行转换。
比如说有一个User类,User中包含用户的姓名和年龄
data class User(var firstName:String,var lastName:String,var age:Int)
map()方法可以将User类型的LiveData自由地转型成任意其他类型地LiveData。
class MainViewModel(countReserved:Int) : ViewModel() { private val userLiveData = MutableLiveData<User>() val userName:LiveData<String>=Transformations.map(userLiveData){user-> "${user.firstName} ${user.lastName}" } }
如果ViewModel中的某个LiveData对象时调用另外的方法获取的,那么我们就可以借助switchMap()方法,将这个LiveData对象转换成另一个可观察的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 } }
到此这篇关于Android开发中用Kotlin编写LiveData组件教程的文章就介绍到这了,更多相关Android LiveData内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
Anroid ListView分组和悬浮Header实现方法
这篇文章主要介绍了Anroid ListView分组和悬浮Header实现方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。2016-11-11
最新评论