From 1f2f4a5e61e7f23ff3d4e55e4fcf6c961c21964a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=BF=97=E5=A8=81?= <1396188796@qq.com> Date: Thu, 6 Apr 2023 21:23:06 +0800 Subject: [PATCH] =?UTF-8?q?mvvm=E8=BF=81=E5=85=A5=E5=8E=9Faac=E4=BB=A3?= =?UTF-8?q?=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mvvm/build.gradle.kts | 57 ++++++++++++++++- .../main/java/org/zhiwei/jetpack/mvvm/aac.txt | 5 ++ .../zhiwei/jetpack/mvvm/model/UserModel.java | 47 ++++++++++++++ .../mvvm/persistent/DataRepository.java | 33 ++++++++++ .../mvvm/persistent/VirtualLocalData.java | 45 ++++++++++++++ .../zhiwei/jetpack/mvvm/view/MvvmActivity.kt | 62 +++++++++++++++++++ .../jetpack/mvvm/viewmodel/UserViewModel.java | 43 +++++++++++++ mvvm/src/main/res/layout/activity_aac.xml | 26 ++++++++ .../org/zhiwei/jetpack/work/WorkActivity.kt | 2 +- 9 files changed, 318 insertions(+), 2 deletions(-) create mode 100644 mvvm/src/main/java/org/zhiwei/jetpack/mvvm/aac.txt create mode 100644 mvvm/src/main/java/org/zhiwei/jetpack/mvvm/model/UserModel.java create mode 100644 mvvm/src/main/java/org/zhiwei/jetpack/mvvm/persistent/DataRepository.java create mode 100644 mvvm/src/main/java/org/zhiwei/jetpack/mvvm/persistent/VirtualLocalData.java create mode 100644 mvvm/src/main/java/org/zhiwei/jetpack/mvvm/view/MvvmActivity.kt create mode 100644 mvvm/src/main/java/org/zhiwei/jetpack/mvvm/viewmodel/UserViewModel.java create mode 100644 mvvm/src/main/res/layout/activity_aac.xml diff --git a/mvvm/build.gradle.kts b/mvvm/build.gradle.kts index bbed1b5..2896c6f 100644 --- a/mvvm/build.gradle.kts +++ b/mvvm/build.gradle.kts @@ -35,9 +35,64 @@ android { dependencies { - implementation(libs.core.ktx) + // android official libs version + implementation(libs.activity.ktx) implementation(libs.appcompat) + implementation(libs.constraintlayout) + implementation(libs.core.ktx) + implementation(libs.fragment.ktx) implementation(libs.material) + implementation(libs.recyclerview) + implementation(libs.swiperefreshlayout) + + + // androidx 或 google 相关库 + implementation(libs.androidx.biometric) + implementation(libs.androidx.browser) + implementation(libs.androidx.camera.camera2) + implementation(libs.androidx.core.splashscreen) + implementation(libs.androidx.dataStore.core) + implementation(libs.androidx.dataStore.preferences) + implementation(libs.androidx.drawerlayout) + implementation(libs.androidx.emoji2) + implementation(libs.androidx.exifinterface) + implementation(libs.androidx.metrics) + implementation(libs.androidx.preference) + implementation(libs.androidx.profileinstaller) + implementation(libs.androidx.startup) + implementation(libs.androidx.tracing) + implementation(libs.androidx.webkit) + + // Jetpack Components libs version + implementation(libs.lifecycle.livedata.ktx) + implementation(libs.lifecycle.viewmodel.ktx) + implementation(libs.navigation.fragment.ktx) + implementation(libs.navigation.ui.ktx) + implementation(libs.room.compiler) + implementation(libs.room.runtime) + implementation(libs.room.ktx) + implementation(libs.paging.runtime.ktx) + implementation(libs.work.runtime.ktx) + + // jetbrains official libs version + implementation(libs.kotlin.stdlib) + implementation(libs.kotlinx.coroutines.android) + implementation(libs.kotlinx.datetime) + implementation(libs.kotlinx.serialization.json) + + // 常用知名开源库 + implementation(libs.blankj.utils) + implementation(libs.coil.kt) + implementation(libs.coil.kt.svg) + implementation(libs.gson) + implementation(libs.koin) + implementation(libs.okhttp.logging) + implementation(libs.retrofit.core) + implementation(libs.retrofit.kotlin.serialization) + implementation(libs.retrofit2.converter.gson) + + //test libs version + testImplementation(libs.turbine) testImplementation(libs.junit) androidTestImplementation(libs.androidx.test.ext.junit) androidTestImplementation(libs.espresso.core) diff --git a/mvvm/src/main/java/org/zhiwei/jetpack/mvvm/aac.txt b/mvvm/src/main/java/org/zhiwei/jetpack/mvvm/aac.txt new file mode 100644 index 0000000..eb3c561 --- /dev/null +++ b/mvvm/src/main/java/org/zhiwei/jetpack/mvvm/aac.txt @@ -0,0 +1,5 @@ +Android Architecture Components + 是谷歌在Google I/O 2017发布一套帮助开发者解决Android架构设计的方案。里面包含了两大块内容: + 生命周期相关的Lifecycle-aware Components + 数据库解决方案Room + diff --git a/mvvm/src/main/java/org/zhiwei/jetpack/mvvm/model/UserModel.java b/mvvm/src/main/java/org/zhiwei/jetpack/mvvm/model/UserModel.java new file mode 100644 index 0000000..8efed43 --- /dev/null +++ b/mvvm/src/main/java/org/zhiwei/jetpack/mvvm/model/UserModel.java @@ -0,0 +1,47 @@ +package org.zhiwei.jetpack.mvvm.model; + +/** + * 简单的model对象类,其实也可以使用接口形式,由具体子类实现 + * Author: zhiwei. + * Date: 2018/11/6 0006,19:28. + */ +public class UserModel { + + private int age; + private String name; + private String city; + + + public int getAge() { + return age; + } + + public void setAge(int age) { + this.age = age; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getCity() { + return city; + } + + public void setCity(String city) { + this.city = city; + } + + @Override + public String toString() { + return "UserModel{" + + "age=" + age + + ", name='" + name + '\'' + + ", city='" + city + '\'' + + '}'; + } +} diff --git a/mvvm/src/main/java/org/zhiwei/jetpack/mvvm/persistent/DataRepository.java b/mvvm/src/main/java/org/zhiwei/jetpack/mvvm/persistent/DataRepository.java new file mode 100644 index 0000000..98d558c --- /dev/null +++ b/mvvm/src/main/java/org/zhiwei/jetpack/mvvm/persistent/DataRepository.java @@ -0,0 +1,33 @@ +package org.zhiwei.jetpack.mvvm.persistent; + + +import org.zhiwei.jetpack.mvvm.model.UserModel; + +import java.util.List; + +/** + * 数据代理类 + * Author: zhiwei. + * Date: 2018/11/6 0006,19:30. + */ +public class DataRepository { + + private static DataRepository instance = new DataRepository(); + private VirtualLocalData localData; + + private DataRepository() { + localData = VirtualLocalData.getInstance(); + } + + public static DataRepository getInstance() { + return instance; + } + + public List getLocalData() { + return localData.getUserList(); + } + + public UserModel getUserByName(String name) { + return localData.getUser(name); + } +} diff --git a/mvvm/src/main/java/org/zhiwei/jetpack/mvvm/persistent/VirtualLocalData.java b/mvvm/src/main/java/org/zhiwei/jetpack/mvvm/persistent/VirtualLocalData.java new file mode 100644 index 0000000..eaf6cda --- /dev/null +++ b/mvvm/src/main/java/org/zhiwei/jetpack/mvvm/persistent/VirtualLocalData.java @@ -0,0 +1,45 @@ +package org.zhiwei.jetpack.mvvm.persistent; + + +import org.zhiwei.jetpack.mvvm.model.UserModel; + +import java.util.ArrayList; +import java.util.List; + +/** + * Author: zhiwei. + * Date: 2018/11/6 0006,20:07. + */ +public class VirtualLocalData { + private static VirtualLocalData instance = new VirtualLocalData(); + + private VirtualLocalData() { + } + + public static VirtualLocalData getInstance() { + return instance; + } + + public UserModel getUser(String name) { + UserModel usr = null; + for (UserModel userModel : getUserList()) { + if (userModel.getName().equals(name)) { + usr = userModel; + } + } + return usr; + } + + public List getUserList() { + List users = new ArrayList<>(); + UserModel user; + for (int i = 0; i < 20; i++) { + user = new UserModel(); + user.setAge(20 + i); + user.setName("小明 " + i); + user.setCity("上海:" + i); + users.add(user); + } + return users; + } +} diff --git a/mvvm/src/main/java/org/zhiwei/jetpack/mvvm/view/MvvmActivity.kt b/mvvm/src/main/java/org/zhiwei/jetpack/mvvm/view/MvvmActivity.kt new file mode 100644 index 0000000..a0216c3 --- /dev/null +++ b/mvvm/src/main/java/org/zhiwei/jetpack/mvvm/view/MvvmActivity.kt @@ -0,0 +1,62 @@ +package org.zhiwei.jetpack.mvvm.view + +import android.os.Bundle +import android.view.View +import android.widget.TextView +import androidx.activity.viewModels +import androidx.appcompat.app.AppCompatActivity +import androidx.lifecycle.Observer +import org.zhiwei.jetpack.mvvm.R +import org.zhiwei.jetpack.mvvm.model.UserModel +import org.zhiwei.jetpack.mvvm.viewmodel.UserViewModel + +/** + * 作者: 志威 zhiwei.org + * 主页: Github: https://github.com/zhiwei1990 + * 日期: 2019年08月05日 19:52 + * 签名: 天行健,君子以自强不息;地势坤,君子以厚德载物。 + * _ _ _ _ ____ _ _ _ + * / \ _ __ __| |_ __ ___ (_) __| | / ___|| |_ _ _ __| (_) ___ + * / _ \ | '_ \ / _` | '__/ _ \| |/ _` | \___ \| __| | | |/ _` | |/ _ \ + * / ___ \| | | | (_| | | | (_) | | (_| | ___) | |_| |_| | (_| | | (_) | + * /_/ \_\_| |_|\__,_|_| \___/|_|\__,_| |____/ \__|\__,_|\__,_|_|\___/ -- 志威 zhiwei.org + * + * You never know what you can do until you try ! + * ---------------------------------------------------------------- + * Android Architecture Components 的架构演示界面 + */ +class MvvmActivity : AppCompatActivity() { + + private val viewModel: UserViewModel by viewModels() + + private var tvList: TextView? = null + private var tvInfo: TextView? = null + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + setContentView(R.layout.activity_aac) + tvList = findViewById(R.id.tv_user_list_aac) + tvInfo = findViewById(R.id.tv_user_info_aac) + + viewModel.userList.observe( + this, + Observer { userModels: List -> + val sb = StringBuilder() + for (model in userModels) { + sb.append(model.toString()).append("\n") + } + tvList!!.text = sb.toString() + } + ) + viewModel.userInfo.observe( + this, + Observer { s: String -> tvInfo?.text = s } + ) + } + + fun load(view: View?) { + viewModel.loadData() + viewModel.loadUserName("小明 3") + } + +} \ No newline at end of file diff --git a/mvvm/src/main/java/org/zhiwei/jetpack/mvvm/viewmodel/UserViewModel.java b/mvvm/src/main/java/org/zhiwei/jetpack/mvvm/viewmodel/UserViewModel.java new file mode 100644 index 0000000..833bae8 --- /dev/null +++ b/mvvm/src/main/java/org/zhiwei/jetpack/mvvm/viewmodel/UserViewModel.java @@ -0,0 +1,43 @@ +package org.zhiwei.jetpack.mvvm.viewmodel; + +import androidx.lifecycle.LiveData; +import androidx.lifecycle.MediatorLiveData; +import androidx.lifecycle.MutableLiveData; +import androidx.lifecycle.ViewModel; + +import org.zhiwei.jetpack.mvvm.model.UserModel; +import org.zhiwei.jetpack.mvvm.persistent.DataRepository; + +import java.util.List; + +/** + * Author: zhiwei. + * Date: 2018/11/6 0006,19:20. + */ +public class UserViewModel extends ViewModel { + + MutableLiveData> userList = new MutableLiveData<>(); + MediatorLiveData userInfo = new MediatorLiveData<>(); + private DataRepository repository; + + public UserViewModel() { + super(); + repository = DataRepository.getInstance(); + } + + public void loadData() { + userList.setValue(repository.getLocalData()); + } + + public void loadUserName(String name) { + userInfo.setValue(repository.getUserByName(name).toString()); + } + + public LiveData> getUserList() { + return userList; + } + + public LiveData getUserInfo() { + return userInfo; + } +} diff --git a/mvvm/src/main/res/layout/activity_aac.xml b/mvvm/src/main/res/layout/activity_aac.xml new file mode 100644 index 0000000..a41e905 --- /dev/null +++ b/mvvm/src/main/res/layout/activity_aac.xml @@ -0,0 +1,26 @@ + + + + + +