Jetpack练手(02):LiveData


一、导入依赖

新建 LiveDataDemo 工程,在 build.gradle(Module:app) 中参考 Lifecycle 声明依赖项 导入依赖。

dependencies {
    def lifecycle_version = "2.2.0"

    // ViewModel
    implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version"
    // LiveData
    implementation "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle_version"

	...
}

二、搭建布局

activity_main.xml 搭建简单布局(省略属性),如下:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/tvVote" />

    <ImageButton
        android:id="@+id/imgBtnUpvote" />

    <ImageButton
        android:id="@+id/imgBtnDownvote" />

</androidx.constraintlayout.widget.ConstraintLayout>

包含三个控件:

  1. tvVote - TextView,显示点赞数;
  2. imgBtnUpvote - ImageButton,点赞的按钮;
  3. imgBtnDownvote - ImageButton,点踩的按钮。

注意:在 ImageButton 使用 res/drawble 添加的 Vector Asset 作为 app:srcCompat 时,需要在 build.gradle(Module:app) 中添加:

android {
    defaultConfig {
		...
        vectorDrawables.useSupportLibrary = true
    }
}

整体布局如图:
在这里插入图片描述


三、创建 LiveData 对象

com.example.viewmodeldemo 目录下新建 VoteViewModel 类继承自 ViewModel(),参考 官方 LiveData 概述,定义一个 MutableLiveData 类型的属性,并定义两个方法 upVote()downVote(),如下:

class VoteViewModel : ViewModel() {

    val vote: MutableLiveData<Int> by lazy {
        MutableLiveData<Int>(0)
    }

    fun upVote() {
        vote.value = vote.value?.plus(1)
    }

    fun downVote() {
        vote.value = vote.value?.minus(1)
    }
}

四、观察 LiveData 对象

参考 官方 LiveData 概述,在 MainActivity 类中,使用 Kotlin by viewModels() 属性委托来声明一个 VoteViewModel 的实例:

private val voteViewModel: VoteViewModel by viewModels()

使用该属性委托需要在 build.gradle(Module:app) 添加 androidx.activity 依赖:

dependencies {
    ...
    def activity_version = "1.1.0"

    // androidx.activity
    implementation "androidx.activity:activity-ktx:$activity_version"
	...
}

此时 viewModels() 仍报错:

Cannot inline bytecode built with JVM target 1.8 into bytecode that is being built with JVM target 1.6. 
Please specify proper '-jvm-target' option

需要在 build.gradle(Module:app) 里加入:

android {
	...
    // Java
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    // For Kotlin projects
    kotlinOptions {
        jvmTarget = "1.8"
    }
}

MainActivity.onCreate() 中创建观察者来更新 TextView 控件,并监听两个按钮的点击事件,分别调用 VoteViewModelupVote()downVote() 方法:

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    voteViewModel.vote.observe(this, Observer<Int> { newVote ->
        tvVote.text = newVote.toString()
    })

    imgBtnUpvote.setOnClickListener {
        voteViewModel.upVote()
    }

    imgBtnDownvote.setOnClickListener {
        voteViewModel.downVote()
    }
}

五、Demo 效果

效果如下:

在这里插入图片描述


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值