基本使用
class MainViewModel: ViewModel(){
var count = 0
}
class MainActivity : AppCompatActivity() {
lateinit var viewModel:MainViewModel
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
setContentView(R.layout.activity_main)
viewModel = ViewModelProvider(this).get(MainViewModel::class.java)
// 只能通过ViewModelProvider去创建viewmodel实例
val btn: Button = findViewById(R.id.plusOneBtn)
btn.setOnClickListener {
viewModel.count++
showdata()
}
showdata()
}
private fun showdata(){
val textview:TextView = findViewById(R.id.infoText)
textview.setText(viewModel.count.toString())
}
}
ViewModel的作用是帮助我们管理UI相关的数据和业务逻辑,实现数据的存储、共享、隔离和生命周期管理,从而提高应用程序的可维护性和可扩展性。
传参给viewmodel
class MainViewModel(countReserved: Int): ViewModel(){
var count = countReserved
}
class MainViewModelFactory(private val countReserved: Int) : ViewModelProvider.Factory {
override fun <T : ViewModel> create(modelClass: Class<T>): T {
return MainViewModel(countReserved) as T
}
// MainViewModelFactory类的create()方法会根据传入的modelClass参数来判断需要创建哪种类型的
// ViewModel实例,并调用MainViewModel的构造函数来创建实例。在创建实例时,会将传入的
// countReserved参数传递给MainViewModel的构造函数,用于初始化MainViewModel中的count属性
}
class MainActivity : AppCompatActivity() {
lateinit var viewModel: MainViewModel
lateinit var sp: SharedPreferences
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
sp = getPreferences(Context.MODE_PRIVATE)
val countReserved = sp.getInt("count_reserved", 0)
viewModel = ViewModelProvider(this, MainViewModelFactory(countReserved))
.get(MainViewModel::class.java)
/*this表示当前Activity的上下文,用于与ViewModelProvider进行绑定。
MainViewModelFactory(countReserved)表示一个MainViewModelFactory的实例,用于创建
MainViewModel的实例,并传入countReserved参数,用于初始化MainViewModel中的count属性
调用ViewModelProvider的get()方法,传入MainViewModel::class.java参数,表示需要创建
的ViewModel的类型是MainViewModel。ViewModelProvider会根据传入的参数来判断是否需要创
建新的ViewModel实例,或者直接返回已经存在的ViewModel实例。在这段代码中,我们通过get()
方法获取到了MainViewModel的实例,并将其赋值给viewModel变量。*/
val btn: Button = findViewById(R.id.plusOneBtn)
btn.setOnClickListener {
viewModel.count++
showdata()
}
showdata()
}
private fun showdata(){
val textview:TextView = findViewById(R.id.infoText)
textview.setText(viewModel.count.toString())
}
override fun onPause() {
super.onPause()
sp.edit {
putInt("count_reserved", viewModel.count)
}
}
}
代码实现了即使退出程序也不会清空数据。这段代码的作用是在Activity中创建MainViewModel的实例,并将其与当前Activity绑定。它使用了ViewModelProvider和MainViewModelFactory类,用于创建MainViewModel的实例,并传入countReserved参数,用于初始化MainViewModel中的count属性。然后,我们通过get()方法获取到了MainViewModel的实例,并将其赋值给viewModel变量。这样,我们就可以在Activity中使用viewModel变量来访问MainViewModel中的数据和方法。
LiveData
class MainViewModel(countReserved: Int) : ViewModel() {
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()
})
}
override fun onPause() {
super.onPause()
sp.edit {
putInt("count_reserved", viewModel.counter.value ?: 0)
}
}
}
map
switchmap
switchMap()是Android Architecture Components中的一个常用函数,它用于将LiveData对象转换为另一个LiveData对象。switchMap()函数的作用是在源LiveData对象发生变化时,自动切换到一个新的LiveData对象。
switchMap()函数通常用于处理需要异步加载数据的情况,例如从数据库或网络中获取数据