layout
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/id_btn_get_user_data"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="20dp"
android:background="@color/black"
android:gravity="center_horizontal"
android:paddingLeft="10dp"
android:paddingTop="20dp"
android:paddingRight="10dp"
android:paddingBottom="20dp"
android:text="get user data"
android:textColor="@color/white"
android:textSize="30dp"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/id_tv_show_user_data"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="60dp"
android:gravity="center_horizontal"
android:text="result"
android:textSize="30dp"
app:layout_constraintTop_toBottomOf="@+id/id_btn_get_user_data" />
</androidx.constraintlayout.widget.ConstraintLayout>
Entity
package com.example.jetpack_zlz;
public class UserDataEntity {
private String id;
private String salary;
public UserDataEntity(String id, String salary) {
this.id = id;
this.salary = salary;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getSalary() {
return salary;
}
public void setSalary(String salary) {
this.salary = salary;
}
}
ViewModel
public class MyViewModel extends ViewModel {
/**
* userLiveData LiveData
*/
private MutableLiveData<UserDataEntity> userLiveData = null;
/**
* 构造函数
*/
public MyViewModel() {
userLiveData = new MutableLiveData<>();
}
/**
* 获取 LiveData
*
* @return LiveData
*/
public MutableLiveData<UserDataEntity> getLiveData() {
return userLiveData;
}
/**
* 获取测试数据
*/
public void updateUserData() {
new Thread(new Runnable() {
@Override
public void run() {
int id = new Random().nextInt(100);
float salary = new Random().nextInt(6000) + 6000;
UserDataEntity user = new UserDataEntity(Integer.toString(id), Float.toString(salary));
userLiveData.postValue(user);
}
}).start();
}
}
Activity
public class UserActivity extends BaseActivity {
private MyViewModel myViewModel;
@BindView(R.id.id_btn_get_user_data)
TextView btnGetUserData;
@BindView(R.id.id_tv_show_user_data)
TextView tvShowUserData;
@Override
protected void init() {
//获取 ViewModel 实例
myViewModel = new ViewModelProvider(getActivity(), new ViewModelProvider.NewInstanceFactory()).get(MyViewModel.class);
//观察数据变化
myViewModel.getLiveData().observe(getActivity(), new Observer<UserDataEntity>() {
@Override
public void onChanged(UserDataEntity userDataEntity) {
updateUI(userDataEntity);
}
});
//在LiveData对象分发给观察者之前对其中存储的值进行更改
Transformations.map(myViewModel.getLiveData(), new Function<UserDataEntity, Object>() {
@Override
public Object apply(UserDataEntity user) {
user.setSalary("9876.0");
return user;
}
}).observe(getActivity(), new Observer<Object>() {
@Override
public void onChanged(Object o) {
updateUIAfterModify((UserDataEntity) o);
}
});
//按钮点击
btnGetUserData.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
myViewModel.updateUserData();
}
});
}
/**
* 更新界面
*
* @param user
*/
private void updateUI(UserDataEntity user) {
String content = "id : " + user.getId() + "\n" + "salary : " + user.getSalary();
tvShowUserData.setText(content);
}
/**
* 更新界面
*
* @param user
*/
private void updateUIAfterModify(UserDataEntity user) {
String oldContent = tvShowUserData.getText().toString().trim();
String newContent = "id : " + user.getId() + "\n" + "salary : " + user.getSalary();
tvShowUserData.setText(oldContent + "\n" + newContent);
}
@Override
protected int getLayoutId() {
return R.layout.act_user;
}
}