├── README.md ├── app ├── .gitignore ├── build.gradle ├── proguard-rules.pro ├── schemas │ └── com.wd.room.AppDatabase │ │ └── 3.json └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── wd │ │ └── room │ │ └── ExampleInstrumentedTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── com │ │ │ └── wd │ │ │ └── room │ │ │ ├── AppDatabase.java │ │ │ ├── Goods.java │ │ │ ├── LoginModel.java │ │ │ ├── MainActivity.java │ │ │ ├── TwoActivity.java │ │ │ ├── User.java │ │ │ ├── UserDao.java │ │ │ ├── activity │ │ │ ├── BaseActivity.java │ │ │ └── LeftRightActivity.java │ │ │ ├── adapter │ │ │ ├── MyAdapter.java │ │ │ ├── OneListAdapter.java │ │ │ └── WDAdapter.java │ │ │ ├── fragment │ │ │ ├── OneFragment.java │ │ │ ├── TestFragment.java │ │ │ └── TwoFragment.java │ │ │ ├── lifecycle │ │ │ └── MainLifeCycle.java │ │ │ └── viewmodel │ │ │ └── ListValueViewModel.java │ └── res │ │ ├── drawable-v24 │ │ └── ic_launcher_foreground.xml │ │ ├── drawable │ │ └── ic_launcher_background.xml │ │ ├── layout │ │ ├── activity_left_right.xml │ │ ├── activity_main.xml │ │ ├── activity_two.xml │ │ ├── frag_one.xml │ │ ├── frag_test.xml │ │ ├── frag_two.xml │ │ ├── item_goods.xml │ │ └── item_one.xml │ │ ├── mipmap-anydpi-v26 │ │ ├── ic_launcher.xml │ │ └── ic_launcher_round.xml │ │ ├── mipmap-hdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-mdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxxhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ └── values │ │ ├── colors.xml │ │ ├── strings.xml │ │ └── styles.xml │ └── test │ └── java │ └── com │ └── wd │ └── room │ └── ExampleUnitTest.java ├── build.gradle ├── gradle.properties ├── gradlew ├── gradlew.bat └── settings.gradle /README.md: -------------------------------------------------------------------------------- 1 | # Android - Jetpack - Demo 2 | ROOM数据库+DataBinding+LiveData+ViewModel+Lifecycles 3 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | android { 4 | compileSdkVersion 29 5 | buildToolsVersion "29.0.2" 6 | defaultConfig { 7 | applicationId "com.wd.room" 8 | minSdkVersion 15 9 | targetSdkVersion 29 10 | versionCode 1 11 | versionName "1.0" 12 | testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" 13 | javaCompileOptions { 14 | annotationProcessorOptions { 15 | arguments = ["room.schemaLocation": 16 | "$projectDir/schemas".toString()] 17 | } 18 | } 19 | } 20 | dataBinding { 21 | enabled = true 22 | } 23 | buildTypes { 24 | release { 25 | minifyEnabled false 26 | proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' 27 | } 28 | } 29 | } 30 | 31 | dependencies { 32 | implementation fileTree(dir: 'libs', include: ['*.jar']) 33 | implementation 'androidx.appcompat:appcompat:1.0.2' 34 | implementation 'androidx.constraintlayout:constraintlayout:1.1.3' 35 | testImplementation 'junit:junit:4.12' 36 | androidTestImplementation 'androidx.test.ext:junit:1.1.0' 37 | androidTestImplementation 'androidx.test.espresso:espresso-core:3.1.1' 38 | 39 | def room_version = "2.2.3" 40 | 41 | implementation "androidx.room:room-runtime:$room_version" 42 | annotationProcessor "androidx.room:room-compiler:$room_version" // For Kotlin use kapt instead of annotationProcessor 43 | implementation "android.arch.persistence.room:rxjava2:$room_version" 44 | implementation 'com.google.code.gson:gson:2.8.5' 45 | implementation 'androidx.recyclerview:recyclerview:1.1.0' 46 | 47 | def lifecycle_version = "2.2.0" 48 | 49 | // ViewModel 50 | implementation "androidx.lifecycle:lifecycle-viewmodel:$lifecycle_version" 51 | // LiveData 52 | implementation "androidx.lifecycle:lifecycle-livedata:$lifecycle_version" 53 | // Lifecycles only (without ViewModel or LiveData) 54 | implementation "androidx.lifecycle:lifecycle-runtime:$lifecycle_version" 55 | 56 | // Saved state module for ViewModel 57 | implementation "androidx.lifecycle:lifecycle-viewmodel-savedstate:$lifecycle_version" 58 | 59 | 60 | 61 | } 62 | -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile 22 | -------------------------------------------------------------------------------- /app/schemas/com.wd.room.AppDatabase/3.json: -------------------------------------------------------------------------------- 1 | { 2 | "formatVersion": 1, 3 | "database": { 4 | "version": 3, 5 | "identityHash": "0e7a0490f1b46e7e4f748304d46b3b08", 6 | "entities": [ 7 | { 8 | "tableName": "User", 9 | "createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, `name` TEXT, `age` INTEGER NOT NULL, `sex` TEXT, `desc` TEXT)", 10 | "fields": [ 11 | { 12 | "fieldPath": "id", 13 | "columnName": "id", 14 | "affinity": "INTEGER", 15 | "notNull": true 16 | }, 17 | { 18 | "fieldPath": "name", 19 | "columnName": "name", 20 | "affinity": "TEXT", 21 | "notNull": false 22 | }, 23 | { 24 | "fieldPath": "age", 25 | "columnName": "age", 26 | "affinity": "INTEGER", 27 | "notNull": true 28 | }, 29 | { 30 | "fieldPath": "sex", 31 | "columnName": "sex", 32 | "affinity": "TEXT", 33 | "notNull": false 34 | }, 35 | { 36 | "fieldPath": "desc", 37 | "columnName": "desc", 38 | "affinity": "TEXT", 39 | "notNull": false 40 | } 41 | ], 42 | "primaryKey": { 43 | "columnNames": [ 44 | "id" 45 | ], 46 | "autoGenerate": true 47 | }, 48 | "indices": [], 49 | "foreignKeys": [] 50 | } 51 | ], 52 | "views": [], 53 | "setupQueries": [ 54 | "CREATE TABLE IF NOT EXISTS room_master_table (id INTEGER PRIMARY KEY,identity_hash TEXT)", 55 | "INSERT OR REPLACE INTO room_master_table (id,identity_hash) VALUES(42, '0e7a0490f1b46e7e4f748304d46b3b08')" 56 | ] 57 | } 58 | } -------------------------------------------------------------------------------- /app/src/androidTest/java/com/wd/room/ExampleInstrumentedTest.java: -------------------------------------------------------------------------------- 1 | package com.wd.room; 2 | 3 | import android.content.Context; 4 | 5 | import androidx.test.platform.app.InstrumentationRegistry; 6 | import androidx.test.ext.junit.runners.AndroidJUnit4; 7 | 8 | import org.junit.Test; 9 | import org.junit.runner.RunWith; 10 | 11 | import static org.junit.Assert.*; 12 | 13 | /** 14 | * Instrumented test, which will execute on an Android device. 15 | * 16 | * @see Testing documentation 17 | */ 18 | @RunWith(AndroidJUnit4.class) 19 | public class ExampleInstrumentedTest { 20 | @Test 21 | public void useAppContext() { 22 | // Context of the app under test. 23 | Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); 24 | 25 | assertEquals("com.wd.room", appContext.getPackageName()); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | -------------------------------------------------------------------------------- /app/src/main/java/com/wd/room/AppDatabase.java: -------------------------------------------------------------------------------- 1 | package com.wd.room; 2 | 3 | import androidx.room.Database; 4 | import androidx.room.RoomDatabase; 5 | 6 | @Database(entities = User.class, version = 3) 7 | public abstract class AppDatabase extends RoomDatabase { 8 | public abstract UserDao getUserDao(); 9 | } -------------------------------------------------------------------------------- /app/src/main/java/com/wd/room/Goods.java: -------------------------------------------------------------------------------- 1 | package com.wd.room; 2 | 3 | import androidx.databinding.BaseObservable; 4 | 5 | public class Goods extends BaseObservable { 6 | public int gid; 7 | public String name; 8 | } 9 | -------------------------------------------------------------------------------- /app/src/main/java/com/wd/room/LoginModel.java: -------------------------------------------------------------------------------- 1 | package com.wd.room; 2 | 3 | import com.wd.room.databinding.ActivityMainBinding; 4 | 5 | public class LoginModel { 6 | 7 | ActivityMainBinding activityMainBinding; 8 | public LoginModel(ActivityMainBinding activityMainBinding){ 9 | this.activityMainBinding = activityMainBinding; 10 | } 11 | 12 | public void login(String phone,String pwd){ 13 | //发送请求中***** 14 | User user = new User(); 15 | user.name = phone+" "+pwd; 16 | //得到请求结果**** 17 | activityMainBinding.setLoginUser(user); 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /app/src/main/java/com/wd/room/MainActivity.java: -------------------------------------------------------------------------------- 1 | package com.wd.room; 2 | 3 | import androidx.appcompat.app.AppCompatActivity; 4 | import androidx.databinding.DataBindingUtil; 5 | import androidx.room.Room; 6 | 7 | import android.os.Bundle; 8 | import android.util.Log; 9 | import android.view.View; 10 | 11 | import com.wd.room.activity.BaseActivity; 12 | import com.wd.room.databinding.ActivityMainBinding; 13 | import com.wd.room.lifecycle.MainLifeCycle; 14 | 15 | 16 | public class MainActivity extends BaseActivity { 17 | @Override 18 | protected void initView(Bundle savedInstanceState) { 19 | getLifecycle().addObserver(new MainLifeCycle(binding,getBaseContext())); 20 | } 21 | 22 | @Override 23 | protected int getLayoutId() { 24 | return R.layout.activity_main; 25 | } 26 | 27 | @Override 28 | protected void onDestroy() { 29 | super.onDestroy(); 30 | 31 | } 32 | 33 | @Override 34 | protected void finalize() throws Throwable { 35 | super.finalize(); 36 | } 37 | } 38 | -------------------------------------------------------------------------------- /app/src/main/java/com/wd/room/TwoActivity.java: -------------------------------------------------------------------------------- 1 | package com.wd.room; 2 | 3 | import android.os.Bundle; 4 | 5 | import androidx.annotation.Nullable; 6 | import androidx.appcompat.app.AppCompatActivity; 7 | import androidx.databinding.DataBindingUtil; 8 | 9 | import com.wd.room.activity.BaseActivity; 10 | import com.wd.room.databinding.ActivityTwoBinding; 11 | 12 | public class TwoActivity extends BaseActivity { 13 | 14 | 15 | @Override 16 | protected void initView(Bundle savedInstanceState) { 17 | // binding.**** 18 | } 19 | 20 | @Override 21 | protected int getLayoutId() { 22 | return R.layout.activity_two; 23 | } 24 | } 25 | -------------------------------------------------------------------------------- /app/src/main/java/com/wd/room/User.java: -------------------------------------------------------------------------------- 1 | package com.wd.room; 2 | 3 | import androidx.databinding.BaseObservable; 4 | import androidx.room.Entity; 5 | import androidx.room.Ignore; 6 | import androidx.room.PrimaryKey; 7 | 8 | @Entity 9 | public class User extends BaseObservable { 10 | 11 | @Ignore 12 | public User(){} 13 | 14 | public User(String name, int age, String sex, String desc) { 15 | this.name = name; 16 | this.age = age; 17 | this.sex = sex; 18 | this.desc = desc; 19 | } 20 | 21 | @PrimaryKey(autoGenerate = true) 22 | public int id; 23 | public String name; 24 | public int age; 25 | public String sex; 26 | public String desc; 27 | } 28 | -------------------------------------------------------------------------------- /app/src/main/java/com/wd/room/UserDao.java: -------------------------------------------------------------------------------- 1 | package com.wd.room; 2 | 3 | import androidx.room.Dao; 4 | import androidx.room.Delete; 5 | import androidx.room.Insert; 6 | import androidx.room.OnConflictStrategy; 7 | import androidx.room.Query; 8 | import androidx.room.Update; 9 | 10 | import java.util.List; 11 | 12 | @Dao 13 | public interface UserDao { 14 | @Insert(onConflict = OnConflictStrategy.REPLACE) 15 | public void insertUsers(User... users); 16 | 17 | @Insert 18 | public void insertBothUsers(User user1, User user2); 19 | 20 | @Insert 21 | public void insertUsersAndFriends(User user, List friends); 22 | 23 | @Update 24 | public void updateUsers(User... users); 25 | 26 | @Delete 27 | public void deleteUsers(User... users); 28 | 29 | @Query("SELECT * FROM user") 30 | public List loadAllUsers(); 31 | } -------------------------------------------------------------------------------- /app/src/main/java/com/wd/room/activity/BaseActivity.java: -------------------------------------------------------------------------------- 1 | package com.wd.room.activity; 2 | 3 | import android.os.Bundle; 4 | 5 | import androidx.annotation.LayoutRes; 6 | import androidx.annotation.Nullable; 7 | import androidx.appcompat.app.AppCompatActivity; 8 | import androidx.databinding.DataBindingUtil; 9 | import androidx.databinding.ViewDataBinding; 10 | 11 | import com.wd.room.R; 12 | import com.wd.room.databinding.ActivityTwoBinding; 13 | 14 | public abstract class BaseActivity extends AppCompatActivity { 15 | 16 | protected D binding; 17 | 18 | @Override 19 | protected void onCreate(@Nullable Bundle savedInstanceState) { 20 | super.onCreate(savedInstanceState); 21 | binding = DataBindingUtil.setContentView(this,getLayoutId()); 22 | initView(savedInstanceState); 23 | //发送请求 24 | } 25 | 26 | 27 | protected abstract void initView(Bundle savedInstanceState); 28 | protected abstract @LayoutRes int getLayoutId(); 29 | } 30 | -------------------------------------------------------------------------------- /app/src/main/java/com/wd/room/activity/LeftRightActivity.java: -------------------------------------------------------------------------------- 1 | package com.wd.room.activity; 2 | 3 | 4 | import android.os.Bundle; 5 | 6 | import com.wd.room.R; 7 | import com.wd.room.databinding.ActivityLeftRightBinding; 8 | 9 | public class LeftRightActivity extends BaseActivity { 10 | @Override 11 | protected void initView(Bundle savedInstanceState) { 12 | 13 | } 14 | 15 | @Override 16 | protected int getLayoutId() { 17 | return R.layout.activity_left_right; 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /app/src/main/java/com/wd/room/adapter/MyAdapter.java: -------------------------------------------------------------------------------- 1 | package com.wd.room.adapter; 2 | 3 | import android.view.LayoutInflater; 4 | import android.view.View; 5 | import android.view.ViewGroup; 6 | 7 | import androidx.annotation.NonNull; 8 | import androidx.databinding.DataBindingUtil; 9 | import androidx.recyclerview.widget.RecyclerView; 10 | 11 | import com.wd.room.Goods; 12 | import com.wd.room.R; 13 | import com.wd.room.databinding.ItemGoodsBinding; 14 | 15 | import java.util.ArrayList; 16 | import java.util.List; 17 | 18 | public class MyAdapter extends WDAdapter { 19 | 20 | 21 | @Override 22 | protected int getLayoutId(int viewType) { 23 | return R.layout.item_goods; 24 | } 25 | 26 | @Override 27 | protected void bindView(ItemGoodsBinding binding, int position) { 28 | binding.setGoods(getItem(position)); 29 | // binding.call.setOnClickListener(); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /app/src/main/java/com/wd/room/adapter/OneListAdapter.java: -------------------------------------------------------------------------------- 1 | package com.wd.room.adapter; 2 | 3 | import android.view.LayoutInflater; 4 | import android.view.View; 5 | import android.view.ViewGroup; 6 | import android.widget.BaseAdapter; 7 | 8 | import androidx.databinding.DataBindingUtil; 9 | 10 | import com.wd.room.R; 11 | import com.wd.room.databinding.ItemOneBinding; 12 | 13 | import java.util.ArrayList; 14 | import java.util.List; 15 | 16 | public class OneListAdapter extends BaseAdapter { 17 | 18 | List list = new ArrayList<>(); 19 | 20 | @Override 21 | public int getCount() { 22 | return list.size(); 23 | } 24 | 25 | public void add(String value){ 26 | list.add(value); 27 | } 28 | 29 | @Override 30 | public String getItem(int position) { 31 | return list.get(position); 32 | } 33 | 34 | @Override 35 | public long getItemId(int position) { 36 | return position; 37 | } 38 | 39 | @Override 40 | public View getView(int position, View convertView, ViewGroup parent) { 41 | ItemOneBinding binding; 42 | if (convertView == null){ 43 | binding = DataBindingUtil.inflate( 44 | LayoutInflater.from(parent.getContext()), 45 | R.layout.item_one,parent,false); 46 | convertView = binding.getRoot(); 47 | }else{ 48 | binding = DataBindingUtil.bind(convertView); 49 | } 50 | binding.setValue(list.get(position)); 51 | 52 | return convertView; 53 | } 54 | } 55 | -------------------------------------------------------------------------------- /app/src/main/java/com/wd/room/adapter/WDAdapter.java: -------------------------------------------------------------------------------- 1 | package com.wd.room.adapter; 2 | 3 | import android.view.LayoutInflater; 4 | import android.view.View; 5 | import android.view.ViewGroup; 6 | 7 | import androidx.annotation.LayoutRes; 8 | import androidx.annotation.NonNull; 9 | import androidx.databinding.DataBindingUtil; 10 | import androidx.databinding.ViewDataBinding; 11 | import androidx.recyclerview.widget.RecyclerView; 12 | 13 | import com.wd.room.Goods; 14 | import com.wd.room.R; 15 | import com.wd.room.databinding.ItemGoodsBinding; 16 | 17 | import java.util.ArrayList; 18 | import java.util.List; 19 | 20 | public abstract class WDAdapter extends RecyclerView.Adapter { 21 | 22 | private List list = new ArrayList<>(); 23 | 24 | @NonNull 25 | @Override 26 | public MyHodler onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { 27 | T binding = DataBindingUtil.inflate( 28 | LayoutInflater.from(parent.getContext()), 29 | getLayoutId(viewType),parent,false); 30 | 31 | return new MyHodler(binding.getRoot()); 32 | } 33 | 34 | protected abstract @LayoutRes 35 | int getLayoutId(int viewType); 36 | 37 | @Override 38 | public void onBindViewHolder(@NonNull MyHodler holder, int position) { 39 | T binding = DataBindingUtil.bind(holder.itemView); 40 | bindView(binding,position); 41 | } 42 | 43 | protected abstract void bindView(T binding,int position); 44 | 45 | public D getItem(int position){ 46 | return list.get(position); 47 | } 48 | 49 | public void addItem(D item){ 50 | if (item != null) 51 | list.add(item); 52 | } 53 | 54 | public void addAll(List data){ 55 | if (data != null) 56 | list.addAll(data); 57 | } 58 | 59 | public void clear(){ 60 | list.clear(); 61 | } 62 | 63 | @Override 64 | public int getItemCount() { 65 | return list.size(); 66 | } 67 | 68 | static class MyHodler extends RecyclerView.ViewHolder{ 69 | public MyHodler(@NonNull View itemView) { 70 | super(itemView); 71 | } 72 | } 73 | 74 | } 75 | -------------------------------------------------------------------------------- /app/src/main/java/com/wd/room/fragment/OneFragment.java: -------------------------------------------------------------------------------- 1 | package com.wd.room.fragment; 2 | 3 | import android.os.Bundle; 4 | import android.util.Log; 5 | import android.view.LayoutInflater; 6 | import android.view.View; 7 | import android.view.ViewGroup; 8 | import android.widget.AdapterView; 9 | 10 | import androidx.annotation.NonNull; 11 | import androidx.annotation.Nullable; 12 | import androidx.databinding.DataBindingUtil; 13 | import androidx.fragment.app.Fragment; 14 | import androidx.lifecycle.ViewModelProvider; 15 | import androidx.lifecycle.ViewModelStore; 16 | import androidx.lifecycle.ViewModelStoreOwner; 17 | 18 | import com.wd.room.R; 19 | import com.wd.room.adapter.MyAdapter; 20 | import com.wd.room.adapter.OneListAdapter; 21 | import com.wd.room.databinding.FragOneBinding; 22 | import com.wd.room.databinding.FragTwoBinding; 23 | import com.wd.room.viewmodel.ListValueViewModel; 24 | 25 | public class OneFragment extends Fragment { 26 | 27 | OneListAdapter myAdapter; 28 | 29 | @Nullable 30 | @Override 31 | public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 32 | 33 | FragOneBinding binding = DataBindingUtil.inflate(inflater, 34 | R.layout.frag_one,container,false); 35 | 36 | final ListValueViewModel viewModel = new ViewModelProvider(getActivity()) 37 | .get(ListValueViewModel.class); 38 | 39 | myAdapter = new OneListAdapter(); 40 | myAdapter.add("吴新仲"); 41 | myAdapter.add("轩冉"); 42 | myAdapter.add("刘炳良"); 43 | myAdapter.add("断线的杨世博"); 44 | myAdapter.add("打酱油的刘阳"); 45 | myAdapter.add("修电表的杨石"); 46 | binding.list.setAdapter(myAdapter); 47 | binding.list.setOnItemClickListener(new AdapterView.OnItemClickListener() { 48 | @Override 49 | public void onItemClick(AdapterView parent, View view, int position, long id) { 50 | Log.i("dt",viewModel.hashCode()+""); 51 | viewModel.setName(myAdapter.getItem(position)); 52 | } 53 | }); 54 | 55 | return binding.getRoot(); 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /app/src/main/java/com/wd/room/fragment/TestFragment.java: -------------------------------------------------------------------------------- 1 | package com.wd.room.fragment; 2 | 3 | import android.os.Bundle; 4 | import android.view.LayoutInflater; 5 | import android.view.View; 6 | import android.view.ViewGroup; 7 | 8 | import androidx.annotation.NonNull; 9 | import androidx.annotation.Nullable; 10 | import androidx.databinding.DataBindingUtil; 11 | import androidx.fragment.app.Fragment; 12 | 13 | import com.wd.room.R; 14 | import com.wd.room.User; 15 | import com.wd.room.databinding.FragTestBinding; 16 | 17 | public class TestFragment extends Fragment { 18 | 19 | @Nullable 20 | @Override 21 | public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 22 | 23 | FragTestBinding fragTestBinding = DataBindingUtil.inflate(inflater, R.layout.frag_test,container,false); 24 | fragTestBinding.setU(new User()); 25 | return fragTestBinding.getRoot(); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /app/src/main/java/com/wd/room/fragment/TwoFragment.java: -------------------------------------------------------------------------------- 1 | package com.wd.room.fragment; 2 | 3 | import android.os.Bundle; 4 | import android.util.Log; 5 | import android.view.LayoutInflater; 6 | import android.view.View; 7 | import android.view.ViewGroup; 8 | 9 | import androidx.annotation.NonNull; 10 | import androidx.annotation.Nullable; 11 | import androidx.databinding.DataBindingUtil; 12 | import androidx.fragment.app.Fragment; 13 | import androidx.lifecycle.Lifecycle; 14 | import androidx.lifecycle.LifecycleOwner; 15 | import androidx.lifecycle.Observer; 16 | import androidx.lifecycle.ViewModelProvider; 17 | import androidx.lifecycle.ViewModelStore; 18 | import androidx.lifecycle.ViewModelStoreOwner; 19 | 20 | import com.wd.room.R; 21 | import com.wd.room.databinding.FragTwoBinding; 22 | import com.wd.room.viewmodel.ListValueViewModel; 23 | 24 | public class TwoFragment extends Fragment implements LifecycleOwner { 25 | 26 | @Nullable 27 | @Override 28 | public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { 29 | 30 | final FragTwoBinding binding = DataBindingUtil.inflate(inflater, 31 | R.layout.frag_two,container,false); 32 | 33 | final ListValueViewModel viewModel = new ViewModelProvider(getActivity()) 34 | .get(ListValueViewModel.class); 35 | viewModel.getName().observe(this, new Observer() { 36 | @Override 37 | public void onChanged(String s) { 38 | binding.setValue(s); 39 | Log.i("dt",viewModel.hashCode()+""); 40 | binding.notifyChange(); 41 | } 42 | }); 43 | 44 | return binding.getRoot(); 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /app/src/main/java/com/wd/room/lifecycle/MainLifeCycle.java: -------------------------------------------------------------------------------- 1 | package com.wd.room.lifecycle; 2 | 3 | import android.content.Context; 4 | import android.util.Log; 5 | import android.view.View; 6 | 7 | import androidx.lifecycle.Lifecycle; 8 | import androidx.lifecycle.LifecycleObserver; 9 | import androidx.lifecycle.OnLifecycleEvent; 10 | import androidx.room.Room; 11 | 12 | import com.wd.room.AppDatabase; 13 | import com.wd.room.LoginModel; 14 | import com.wd.room.R; 15 | import com.wd.room.User; 16 | import com.wd.room.UserDao; 17 | import com.wd.room.databinding.ActivityMainBinding; 18 | 19 | import java.util.List; 20 | import java.util.Random; 21 | 22 | /** 23 | * 实现业务和页面的完全解耦,而且做到了内存和性能提升 24 | * 观察者模式,AppCompatActivity作为被观察者,如果被android系统回收之后, 25 | * 那么所有的LifecycleObserver观察者由于观察不到对象,则被系统自动回收, 26 | * 优化内存释放,提升了程序性能 27 | */ 28 | public class MainLifeCycle implements LifecycleObserver, View.OnClickListener { 29 | ActivityMainBinding binding; 30 | Context context; 31 | UserDao userDao; 32 | Random random = new Random(10000); 33 | public MainLifeCycle(ActivityMainBinding binding, Context context) { 34 | this.binding = binding; 35 | this.context = context; 36 | } 37 | 38 | @OnLifecycleEvent(Lifecycle.Event.ON_CREATE) 39 | public void create(){ 40 | Log.i("dt","create()"); 41 | AppDatabase appDatabase = Room.databaseBuilder(context, AppDatabase.class, "Sample.db") 42 | .build(); 43 | 44 | userDao = appDatabase.getUserDao(); 45 | binding.insert.setOnClickListener(this); 46 | binding.query.setOnClickListener(this); 47 | binding.request.setOnClickListener(this); 48 | } 49 | 50 | @OnLifecycleEvent(Lifecycle.Event.ON_RESUME) 51 | public void resume(){ 52 | Log.i("dt","resume()"); 53 | } 54 | 55 | @Override 56 | public void onClick(View v) { 57 | if (v.getId() == R.id.insert){ 58 | new Thread(new Runnable() { 59 | @Override 60 | public void run() { 61 | userDao.insertUsers(new User("小明"+random.nextInt(),random.nextInt(),"男","我也不知道啊")); 62 | } 63 | }).start(); 64 | }else if(v.getId() == R.id.query){ 65 | new Thread(new Runnable() { 66 | @Override 67 | public void run() { 68 | List userList = userDao.loadAllUsers(); 69 | Log.i("dt","查询出来:"+userList.size()); 70 | } 71 | }).start(); 72 | }else if(v.getId()==R.id.request){//模拟请求数据 73 | LoginModel loginModel = new LoginModel(binding); 74 | loginModel.login("13126965104","123456"); 75 | } 76 | } 77 | } 78 | -------------------------------------------------------------------------------- /app/src/main/java/com/wd/room/viewmodel/ListValueViewModel.java: -------------------------------------------------------------------------------- 1 | package com.wd.room.viewmodel; 2 | 3 | import androidx.lifecycle.MutableLiveData; 4 | import androidx.lifecycle.ViewModel; 5 | 6 | public class ListValueViewModel extends ViewModel { 7 | private MutableLiveData name = new MutableLiveData<>(); 8 | 9 | public MutableLiveData getName() { 10 | return name; 11 | } 12 | 13 | public void setName(String str) { 14 | this.name.setValue(str); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v24/ic_launcher_foreground.xml: -------------------------------------------------------------------------------- 1 | 7 | 12 | 13 | 19 | 22 | 25 | 26 | 27 | 28 | 34 | 35 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/ic_launcher_background.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 10 | 15 | 20 | 25 | 30 | 35 | 40 | 45 | 50 | 55 | 60 | 65 | 70 | 75 | 80 | 85 | 90 | 95 | 100 | 105 | 110 | 115 | 120 | 125 | 130 | 135 | 140 | 145 | 150 | 155 | 160 | 165 | 170 | 171 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_left_right.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 12 | 13 | 19 | 20 | 26 | 27 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_main.xml: -------------------------------------------------------------------------------- 1 | 2 | 5 | 6 | 7 | 10 | 13 | 14 | 15 | 20 | 21 |