Andriod Studio-JetPack学习笔记之————11 LiveData (感知数据的变化,自动刷新界面)
简介
和上一篇中的一样,LiveData也是是jetpack的一个架构组件。
当数据变动的时候,LiveData可以用observer自动对界面的数据也进行更新,不需要每次都进行setText等操作。
例子
1.创建一个主界面如下:
xml代码如下
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<TextView
android:id="@+id/textview"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Hello World!"
android:textSize="30sp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.16000003" />
<ImageButton
android:id="@+id/imageButton"
android:layout_width="0dp"
android:layout_height="69dp"
android:layout_marginStart="32dp"
android:contentDescription="imageButton"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintDimensionRatio="w,1:1"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
app:layout_constraintVertical_bias="0.516"
app:srcCompat="@drawable/ic_thumb_up_black_24dp" />
<ImageButton
android:id="@+id/imageButton2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginEnd="32dp"
android:contentDescription="imageButton2"
app:layout_constraintBottom_toBottomOf="@+id/imageButton"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="@+id/imageButton"
app:layout_constraintVertical_bias="1.0"
app:srcCompat="@drawable/ic_thumb_down_black_24dp" />
</androidx.constraintlayout.widget.ConstraintLayout>
其中两个图标是从android自带的矢量图标中选取的。使用矢量图,需要在build.radle中加上一句代码 android.defaultConfig.vectorDrawables.useSupportLibrary = true,否则会报错(添加完之后记得sync)。
2.创建一个java类ViewModelWithLiveData,继承于ViewModel。这个VoewModel管理一个数据:LikedNumber。LikedNumber声明为MultableLiveData。MultableLiveData是容器,Intger是类型。(要把它设置为私有变量,然后用getter和setter访问它。)
(MutableLiveData的父类是LiveData;LiveData在实体类里可以通知指定某个字段的数据更新.
;MutableLiveData则是完全是整个实体类或者数据类型变化后才通知.不会细节到某个字段,转自此博客: 链接.)
然后使用一个getter方法和一个add方法定义对这个数据的操作。(如下列代码所示,这个变量的初始化可以用一个constructor(构造方法),也可以在setter里面直接初始化。)
public class ViewModelWithLiveData extends ViewModel {
private MutableLiveData<Integer> LikedNumber;
// ViewModelWithLiveData(){
// LikedNumber = new MutableLiveData<>();
// LikedNumber.setValue(0);
// }//可以以构造方法的形式进行初始化
public MutableLiveData<Integer> getLikedNumber() {
if(LikedNumber == null){
LikedNumber = new MutableLiveData<>();
LikedNumber.setValue(0);
}
return LikedNumber;
}
public void addLikedNumber(int n){
LikedNumber.setValue(LikedNumber.getValue() + n);
}
}
3.MainActivity中写上如下代码:
package com.heyiping.livedatatest;
import androidx.appcompat.app.AppCompatActivity;
import androidx.lifecycle.Observer;
import androidx.lifecycle.ViewModelProvider;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageButton;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
ViewModelWithLiveData viewModelWithLiveData;
TextView textView;
ImageButton imageButtonLike,imageButtonDislike;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
textView = findViewById(R.id.textview);
imageButtonDislike = findViewById(R.id.imageButton2);
imageButtonLike = findViewById(R.id.imageButton);
viewModelWithLiveData = new ViewModelProvider(this, new ViewModelProvider.NewInstanceFactory()).get(ViewModelWithLiveData.class);//绑定ViewModel和控制器
viewModelWithLiveData.getLikedNumber().observe(this, new Observer<Integer>() {
@Override
public void onChanged(Integer integer) {
textView.setText(String.valueOf(integer));
}
});
imageButtonLike.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
viewModelWithLiveData.addLikedNumber(1);
}
});
imageButtonDislike.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
viewModelWithLiveData.addLikedNumber(-1);
}
});
}
}
其中下列代码是给viewModelWithLiveData设置观察者,当这个数据(getLikedNumber())发生变化时便呼叫onChanged函数。owner必须是具有管理liveCyle功能的对象,它知道什么时候要创建/摧毁,所以在不该被观察的时候也不会被观察到。
viewModelWithLiveData = new ViewModelProvider(this, new ViewModelProvider.NewInstanceFactory()).get(ViewModelWithLiveData.class);//绑定ViewModel和控制器
viewModelWithLiveData.getLikedNumber().observe(this, new Observer<Integer>() {
@Override
public void onChanged(Integer integer) {
textView.setText(String.valueOf(integer));
}
});
运行程序可以得到正确结果。