ViewModel

基本使用

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()函数通常用于处理需要异步加载数据的情况,例如从数据库或网络中获取数据

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值