├── .gitignore ├── .idea ├── codeStyles │ └── Project.xml ├── gradle.xml ├── misc.xml └── runConfigurations.xml ├── README.md ├── app ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── lihang │ │ └── databindinglover │ │ └── ExampleInstrumentedTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── com │ │ │ └── lihang │ │ │ └── databindinglover │ │ │ ├── MainActivity.java │ │ │ ├── MyApplication.java │ │ │ ├── User.java │ │ │ ├── adapter │ │ │ ├── SimpleAdapter.java │ │ │ └── viewholder │ │ │ │ └── NbViewHolder.java │ │ │ ├── bean │ │ │ ├── Dog.java │ │ │ ├── Human.java │ │ │ └── User.java │ │ │ ├── ui │ │ │ ├── AlisActivity.java │ │ │ ├── BaseObservableActivity.java │ │ │ ├── BaseUseActivity.java │ │ │ ├── BindingAdapterActivity.java │ │ │ ├── DataBindActivity.java │ │ │ ├── IncludeActivity.java │ │ │ ├── ObservableCollectionActivity.java │ │ │ ├── ObservableFieldActivity.java │ │ │ ├── RecyclerViewActivity.java │ │ │ └── ViewStubActivity.java │ │ │ └── utils │ │ │ ├── ActivityUtils.java │ │ │ ├── DataBindingHelper.java │ │ │ ├── OnClickStaticUtil.java │ │ │ ├── OnClickUtil.java │ │ │ └── ToastUtils.java │ └── res │ │ ├── drawable-v24 │ │ └── ic_launcher_foreground.xml │ │ ├── drawable │ │ └── ic_launcher_background.xml │ │ ├── layout │ │ ├── activity_alis.xml │ │ ├── activity_baseobservable.xml │ │ ├── activity_baseuse.xml │ │ ├── activity_bind_adapter.xml │ │ ├── activity_collection.xml │ │ ├── activity_databind.xml │ │ ├── activity_include.xml │ │ ├── activity_main.xml │ │ ├── activity_observablefield.xml │ │ ├── activity_recyclerview.xml │ │ ├── activity_viewstub.xml │ │ ├── include_item.xml │ │ ├── item_test.xml │ │ └── viewstub_layout.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 │ └── lihang │ └── databindinglover │ └── ExampleUnitTest.java ├── build.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/caches 5 | /.idea/libraries 6 | /.idea/modules.xml 7 | /.idea/workspace.xml 8 | /.idea/navEditor.xml 9 | /.idea/assetWizardSettings.xml 10 | .DS_Store 11 | /build 12 | /captures 13 | .externalNativeBuild 14 | .cxx 15 | -------------------------------------------------------------------------------- /.idea/codeStyles/Project.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | xmlns:android 14 | 15 | ^$ 16 | 17 | 18 | 19 |
20 |
21 | 22 | 23 | 24 | xmlns:.* 25 | 26 | ^$ 27 | 28 | 29 | BY_NAME 30 | 31 |
32 |
33 | 34 | 35 | 36 | .*:id 37 | 38 | http://schemas.android.com/apk/res/android 39 | 40 | 41 | 42 |
43 |
44 | 45 | 46 | 47 | .*:name 48 | 49 | http://schemas.android.com/apk/res/android 50 | 51 | 52 | 53 |
54 |
55 | 56 | 57 | 58 | name 59 | 60 | ^$ 61 | 62 | 63 | 64 |
65 |
66 | 67 | 68 | 69 | style 70 | 71 | ^$ 72 | 73 | 74 | 75 |
76 |
77 | 78 | 79 | 80 | .* 81 | 82 | ^$ 83 | 84 | 85 | BY_NAME 86 | 87 |
88 |
89 | 90 | 91 | 92 | .* 93 | 94 | http://schemas.android.com/apk/res/android 95 | 96 | 97 | ANDROID_ATTRIBUTE_ORDER 98 | 99 |
100 |
101 | 102 | 103 | 104 | .* 105 | 106 | .* 107 | 108 | 109 | BY_NAME 110 | 111 |
112 |
113 |
114 |
115 |
116 |
-------------------------------------------------------------------------------- /.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 15 | 16 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 14 | -------------------------------------------------------------------------------- /.idea/runConfigurations.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 12 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # DataBindingLover 2 | 对DataBinding全面使用的Demo 3 | 4 | [博客详细讲解](https://juejin.im/post/5d89d9f8f265da03f2340e2b) 5 | -------------------------------------------------------------------------------- /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.lihang.databindinglover" 8 | minSdkVersion 22 9 | targetSdkVersion 29 10 | versionCode 1 11 | versionName "1.0" 12 | testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" 13 | } 14 | buildTypes { 15 | release { 16 | minifyEnabled false 17 | proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' 18 | } 19 | } 20 | 21 | dataBinding { 22 | enabled = true 23 | } 24 | } 25 | 26 | dependencies { 27 | implementation fileTree(dir: 'libs', include: ['*.jar']) 28 | implementation 'androidx.appcompat:appcompat:1.1.0' 29 | implementation 'androidx.constraintlayout:constraintlayout:1.1.3' 30 | testImplementation 'junit:junit:4.12' 31 | androidTestImplementation 'androidx.test:runner:1.2.0' 32 | androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' 33 | implementation 'androidx.recyclerview:recyclerview:1.1.0-beta04' 34 | implementation 'com.github.lihangleo2:MoreAboutRecyclerView:1.0.0' 35 | 36 | implementation 'com.github.bumptech.glide:glide:4.9.0' 37 | annotationProcessor 'com.github.bumptech.glide:compiler:4.9.0' 38 | } 39 | -------------------------------------------------------------------------------- /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/src/androidTest/java/com/lihang/databindinglover/ExampleInstrumentedTest.java: -------------------------------------------------------------------------------- 1 | package com.lihang.databindinglover; 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.lihang.databindinglover", appContext.getPackageName()); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /app/src/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | -------------------------------------------------------------------------------- /app/src/main/java/com/lihang/databindinglover/MainActivity.java: -------------------------------------------------------------------------------- 1 | package com.lihang.databindinglover; 2 | 3 | import androidx.appcompat.app.AppCompatActivity; 4 | import androidx.databinding.BindingAdapter; 5 | import androidx.databinding.DataBindingUtil; 6 | 7 | import android.os.Bundle; 8 | import android.view.View; 9 | 10 | import com.lihang.databindinglover.ui.BaseObservableActivity; 11 | import com.lihang.databindinglover.ui.BindingAdapterActivity; 12 | import com.lihang.databindinglover.ui.DataBindActivity; 13 | import com.lihang.databindinglover.ui.IncludeActivity; 14 | import com.lihang.databindinglover.ui.ObservableCollectionActivity; 15 | import com.lihang.databindinglover.ui.ObservableFieldActivity; 16 | import com.lihang.databindinglover.ui.RecyclerViewActivity; 17 | import com.lihang.databindinglover.ui.ViewStubActivity; 18 | import com.lihang.databindinglover.utils.ActivityUtils; 19 | import com.lihang.databindinglover.databinding.ActivityMainBinding; 20 | import com.lihang.databindinglover.ui.AlisActivity; 21 | import com.lihang.databindinglover.ui.BaseUseActivity; 22 | 23 | public class MainActivity extends AppCompatActivity implements View.OnClickListener { 24 | private ActivityMainBinding binding; 25 | 26 | @Override 27 | protected void onCreate(Bundle savedInstanceState) { 28 | super.onCreate(savedInstanceState); 29 | setContentView(R.layout.activity_main); 30 | binding = DataBindingUtil.setContentView(this, R.layout.activity_main); 31 | binding.setOnClickListener(this); 32 | } 33 | 34 | @Override 35 | public void onClick(View v) { 36 | switch (v.getId()) { 37 | case R.id.btn_base: 38 | ActivityUtils.transfer(this, BaseUseActivity.class); 39 | break; 40 | case R.id.btn_alis: 41 | ActivityUtils.transfer(this, AlisActivity.class); 42 | break; 43 | case R.id.btn_recyclerView: 44 | ActivityUtils.transfer(this, RecyclerViewActivity.class); 45 | break; 46 | 47 | case R.id.btn_baseobservable: 48 | ActivityUtils.transfer(this, BaseObservableActivity.class); 49 | break; 50 | 51 | case R.id.btn_observableField: 52 | ActivityUtils.transfer(this, ObservableFieldActivity.class); 53 | break; 54 | 55 | case R.id.btn_observableCollection: 56 | ActivityUtils.transfer(this, ObservableCollectionActivity.class); 57 | break; 58 | 59 | case R.id.btn_data: 60 | ActivityUtils.transfer(this, DataBindActivity.class); 61 | break; 62 | case R.id.btn_include: 63 | ActivityUtils.transfer(this, IncludeActivity.class); 64 | break; 65 | 66 | case R.id.btn_viewstub: 67 | ActivityUtils.transfer(this, ViewStubActivity.class); 68 | break; 69 | 70 | case R.id.btn_bind_adapter: 71 | ActivityUtils.transfer(this, BindingAdapterActivity.class); 72 | break; 73 | 74 | } 75 | } 76 | } 77 | -------------------------------------------------------------------------------- /app/src/main/java/com/lihang/databindinglover/MyApplication.java: -------------------------------------------------------------------------------- 1 | package com.lihang.databindinglover; 2 | 3 | import android.app.Application; 4 | import android.content.Context; 5 | 6 | /** 7 | * Created by leo 8 | * on 2019/9/27. 9 | */ 10 | public class MyApplication extends Application { 11 | private static MyApplication context; 12 | 13 | @Override 14 | public void onCreate() { 15 | super.onCreate(); 16 | context = this; 17 | } 18 | 19 | public static Context getContext() { 20 | return context; 21 | } 22 | 23 | public static MyApplication getInstance() { 24 | if (context == null) { 25 | context = new MyApplication(); 26 | } 27 | return context; 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /app/src/main/java/com/lihang/databindinglover/User.java: -------------------------------------------------------------------------------- 1 | package com.lihang.databindinglover; 2 | 3 | /** 4 | * Created by leo 5 | * on 2019/9/24. 6 | */ 7 | public class User { 8 | public String name; 9 | public int age; 10 | 11 | public User(String name, int age) { 12 | this.name = name; 13 | this.age = age; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /app/src/main/java/com/lihang/databindinglover/adapter/SimpleAdapter.java: -------------------------------------------------------------------------------- 1 | package com.lihang.databindinglover.adapter; 2 | 3 | import android.view.LayoutInflater; 4 | import android.view.ViewGroup; 5 | 6 | import com.lihang.databindinglover.R; 7 | import com.lihang.databindinglover.adapter.viewholder.NbViewHolder; 8 | import com.lihang.databindinglover.databinding.ItemTestBinding; 9 | import com.lihang.nbadapter.BaseAdapter; 10 | 11 | import androidx.databinding.DataBindingUtil; 12 | import androidx.recyclerview.widget.RecyclerView; 13 | 14 | /** 15 | * Created by leo 16 | * on 2019/9/26. 17 | */ 18 | public class SimpleAdapter extends BaseAdapter { 19 | @Override 20 | public RecyclerView.ViewHolder getViewHolder(ViewGroup viewGroup, int viewType) { 21 | ItemTestBinding binding = DataBindingUtil.inflate(LayoutInflater.from(viewGroup.getContext()), R.layout.item_test, viewGroup, false); 22 | return new NbViewHolder(binding); 23 | } 24 | 25 | @Override 26 | public void onBindMyViewHolder(RecyclerView.ViewHolder viewHolder, int i) { 27 | NbViewHolder nbViewHolder = (NbViewHolder) viewHolder; 28 | ItemTestBinding binding = (ItemTestBinding) nbViewHolder.binding; 29 | binding.txt.setText("就是这么使用 ==> " + i); 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /app/src/main/java/com/lihang/databindinglover/adapter/viewholder/NbViewHolder.java: -------------------------------------------------------------------------------- 1 | package com.lihang.databindinglover.adapter.viewholder; 2 | 3 | import android.view.View; 4 | 5 | import androidx.annotation.NonNull; 6 | import androidx.databinding.ViewDataBinding; 7 | import androidx.recyclerview.widget.RecyclerView; 8 | 9 | /** 10 | * Created by leo 11 | * on 2019/9/26. 12 | */ 13 | public class NbViewHolder extends RecyclerView.ViewHolder { 14 | public ViewDataBinding binding; 15 | 16 | public NbViewHolder(ViewDataBinding binding) { 17 | super(binding.getRoot()); 18 | this.binding = binding; 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /app/src/main/java/com/lihang/databindinglover/bean/Dog.java: -------------------------------------------------------------------------------- 1 | package com.lihang.databindinglover.bean; 2 | 3 | 4 | import com.lihang.databindinglover.BR; 5 | 6 | import androidx.databinding.BaseObservable; 7 | import androidx.databinding.Bindable; 8 | 9 | /** 10 | * Created by leo 11 | * on 2019/9/26. 12 | */ 13 | public class Dog extends BaseObservable { 14 | 15 | //如果是public修饰的,直接用@Bindable 16 | @Bindable 17 | public String name; 18 | //如果是private修饰的,则在get方法使用@Bindable 19 | private String color; 20 | 21 | 22 | public void setDataOnlyName(String name, String color) { 23 | this.name = name; 24 | this.color = color; 25 | //只刷name字段 26 | notifyPropertyChanged(com.lihang.databindinglover.BR.name); 27 | } 28 | 29 | public void setDataAll(String name, String color) { 30 | this.name = name; 31 | this.color = color; 32 | //刷新全部字段 33 | notifyChange(); 34 | } 35 | 36 | 37 | @Bindable 38 | public String getColor() { 39 | return color; 40 | } 41 | 42 | public void setColor(String color) { 43 | this.color = color; 44 | notifyChange(); 45 | } 46 | 47 | public Dog(String name, String color) { 48 | this.name = name; 49 | this.color = color; 50 | } 51 | 52 | public String getName() { 53 | return name; 54 | } 55 | 56 | public void setName(String name) { 57 | this.name = name; 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /app/src/main/java/com/lihang/databindinglover/bean/Human.java: -------------------------------------------------------------------------------- 1 | package com.lihang.databindinglover.bean; 2 | 3 | import androidx.databinding.ObservableField; 4 | import androidx.databinding.ObservableInt; 5 | 6 | /** 7 | * Created by leo 8 | * on 2019/9/26. 9 | */ 10 | public class Human { 11 | //这里必须是常量,ObservableField<参数类型> 12 | //其实写上了下面一句,就是BaseObservable,set,get, @Bindable,刷新都封装了。直接看构造方法 13 | public final ObservableField name = new ObservableField<>(); 14 | //其中也封装了基本数据类型:ObservableInt等 15 | public final ObservableInt age = new ObservableInt(); 16 | 17 | public Human(String name,int age){ 18 | this.name.set(name); 19 | this.age.set(age); 20 | } 21 | 22 | } 23 | -------------------------------------------------------------------------------- /app/src/main/java/com/lihang/databindinglover/bean/User.java: -------------------------------------------------------------------------------- 1 | package com.lihang.databindinglover.bean; 2 | 3 | /** 4 | * Created by leo 5 | * on 2019/9/24. 6 | */ 7 | public class User { 8 | public String name; 9 | public int age; 10 | 11 | public User(String name, int age) { 12 | this.name = name; 13 | this.age = age; 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /app/src/main/java/com/lihang/databindinglover/ui/AlisActivity.java: -------------------------------------------------------------------------------- 1 | package com.lihang.databindinglover.ui; 2 | 3 | import android.os.Bundle; 4 | import android.view.View; 5 | 6 | import com.lihang.databindinglover.R; 7 | import com.lihang.databindinglover.bean.User; 8 | import com.lihang.databindinglover.databinding.ActivityAlisBinding; 9 | 10 | import androidx.annotation.Nullable; 11 | import androidx.appcompat.app.AppCompatActivity; 12 | import androidx.databinding.DataBindingUtil; 13 | 14 | /** 15 | * Created by leo 16 | * on 2019/9/24. 17 | */ 18 | public class AlisActivity extends AppCompatActivity { 19 | private ActivityAlisBinding binding; 20 | 21 | @Override 22 | protected void onCreate(@Nullable Bundle savedInstanceState) { 23 | super.onCreate(savedInstanceState); 24 | setContentView(R.layout.activity_alis); 25 | binding = DataBindingUtil.setContentView(this, R.layout.activity_alis); 26 | User user = new User("user", 18); 27 | com.lihang.databindinglover.User userOther = new com.lihang.databindinglover.User("别名user", 30); 28 | 29 | binding.setUser(user); 30 | binding.setUserSecond(userOther); 31 | } 32 | } 33 | -------------------------------------------------------------------------------- /app/src/main/java/com/lihang/databindinglover/ui/BaseObservableActivity.java: -------------------------------------------------------------------------------- 1 | package com.lihang.databindinglover.ui; 2 | 3 | import android.database.DatabaseUtils; 4 | import android.os.Bundle; 5 | import android.util.Log; 6 | import android.view.View; 7 | 8 | import com.lihang.databindinglover.BR; 9 | import com.lihang.databindinglover.R; 10 | import com.lihang.databindinglover.bean.Dog; 11 | import com.lihang.databindinglover.databinding.ActivityBaseobservableBinding; 12 | 13 | import androidx.annotation.Nullable; 14 | import androidx.appcompat.app.AppCompatActivity; 15 | import androidx.databinding.DataBindingUtil; 16 | import androidx.databinding.Observable; 17 | 18 | /** 19 | * Created by leo 20 | * on 2019/9/26. 21 | */ 22 | public class BaseObservableActivity extends AppCompatActivity implements View.OnClickListener { 23 | ActivityBaseobservableBinding binding; 24 | private Dog dog; 25 | 26 | @Override 27 | protected void onCreate(@Nullable Bundle savedInstanceState) { 28 | super.onCreate(savedInstanceState); 29 | setContentView(R.layout.activity_baseobservable); 30 | 31 | binding = DataBindingUtil.setContentView(this, R.layout.activity_baseobservable); 32 | binding.setOnClickListener(this); 33 | dog = new Dog("默认名字", "默认颜色"); 34 | binding.setDog(dog); 35 | addListener(); 36 | } 37 | 38 | private void addListener() { 39 | dog.addOnPropertyChangedCallback(new Observable.OnPropertyChangedCallback() { 40 | @Override 41 | public void onPropertyChanged(Observable sender, int propertyId) { 42 | if (propertyId == com.lihang.databindinglover.BR.name) { 43 | Log.e("看看刷新了哪", "刷新了name"); 44 | } else if (propertyId == com.lihang.databindinglover.BR._all) { 45 | Log.e("看看刷新了哪", "全部全部"); 46 | } else { 47 | Log.e("看看刷新了哪", "未知错误~"); 48 | } 49 | } 50 | }); 51 | } 52 | 53 | @Override 54 | public void onClick(View v) { 55 | switch (v.getId()) { 56 | case R.id.btn_name: 57 | dog.setDataOnlyName("二哈", "黑白相间"); 58 | break; 59 | 60 | case R.id.btn_all: 61 | dog.setDataAll("金毛", "金黄色"); 62 | break; 63 | } 64 | } 65 | } 66 | -------------------------------------------------------------------------------- /app/src/main/java/com/lihang/databindinglover/ui/BaseUseActivity.java: -------------------------------------------------------------------------------- 1 | package com.lihang.databindinglover.ui; 2 | 3 | import android.os.Bundle; 4 | import android.view.View; 5 | 6 | import com.lihang.databindinglover.R; 7 | import com.lihang.databindinglover.databinding.MyBinding; 8 | import com.lihang.databindinglover.utils.OnClickUtil; 9 | 10 | import androidx.annotation.Nullable; 11 | import androidx.appcompat.app.AppCompatActivity; 12 | import androidx.databinding.DataBindingUtil; 13 | 14 | /** 15 | * Created by leo 16 | * on 2019/9/24. 17 | */ 18 | public class BaseUseActivity extends AppCompatActivity implements View.OnClickListener { 19 | private MyBinding baseuseBinding; 20 | 21 | @Override 22 | protected void onCreate(@Nullable Bundle savedInstanceState) { 23 | super.onCreate(savedInstanceState); 24 | setContentView(R.layout.activity_baseuse); 25 | baseuseBinding = DataBindingUtil.setContentView(this, R.layout.activity_baseuse); 26 | baseuseBinding.setTextStr("这里就能设置数据"); 27 | baseuseBinding.setOnClickListener(this); 28 | baseuseBinding.setOnClickUtil(new OnClickUtil()); 29 | } 30 | 31 | @Override 32 | public void onClick(View v) { 33 | baseuseBinding.txt.setText("点击设置的数据"); 34 | } 35 | } 36 | -------------------------------------------------------------------------------- /app/src/main/java/com/lihang/databindinglover/ui/BindingAdapterActivity.java: -------------------------------------------------------------------------------- 1 | package com.lihang.databindinglover.ui; 2 | 3 | import android.database.DatabaseUtils; 4 | import android.os.Bundle; 5 | 6 | import com.lihang.databindinglover.R; 7 | import com.lihang.databindinglover.databinding.ActivityBindAdapterBinding; 8 | 9 | import androidx.annotation.Nullable; 10 | import androidx.appcompat.app.AppCompatActivity; 11 | import androidx.databinding.DataBindingUtil; 12 | 13 | /** 14 | * Created by leo 15 | * on 2019/9/29. 16 | */ 17 | public class BindingAdapterActivity extends AppCompatActivity { 18 | ActivityBindAdapterBinding binding; 19 | @Override 20 | protected void onCreate(@Nullable Bundle savedInstanceState) { 21 | super.onCreate(savedInstanceState); 22 | setContentView(R.layout.activity_bind_adapter); 23 | binding = DataBindingUtil.setContentView(this,R.layout.activity_bind_adapter); 24 | binding.setImageUrl("https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1569760922081&di=77ffc0adbcfa628168b14665604e6efe&imgtype=0&src=http%3A%2F%2Fhbimg.b0.upaiyun.com%2Fb215dd271e3367eeddc126d52cd1e5a5afe6e98112450-VIqcMR_fw658"); 25 | binding.setTestStr("美女图啊"); 26 | } 27 | } 28 | -------------------------------------------------------------------------------- /app/src/main/java/com/lihang/databindinglover/ui/DataBindActivity.java: -------------------------------------------------------------------------------- 1 | package com.lihang.databindinglover.ui; 2 | 3 | import android.os.Bundle; 4 | import android.view.View; 5 | 6 | import com.lihang.databindinglover.R; 7 | import com.lihang.databindinglover.bean.Human; 8 | import com.lihang.databindinglover.databinding.ActivityDatabindBinding; 9 | 10 | import androidx.annotation.Nullable; 11 | import androidx.appcompat.app.AppCompatActivity; 12 | import androidx.databinding.DataBindingUtil; 13 | 14 | /** 15 | * Created by leo 16 | * on 2019/9/26. 17 | */ 18 | public class DataBindActivity extends AppCompatActivity implements View.OnClickListener { 19 | ActivityDatabindBinding binding; 20 | private Human human; 21 | 22 | @Override 23 | protected void onCreate(@Nullable Bundle savedInstanceState) { 24 | super.onCreate(savedInstanceState); 25 | setContentView(R.layout.activity_databind); 26 | binding = DataBindingUtil.setContentView(this, R.layout.activity_databind); 27 | human = new Human("老李", 18); 28 | binding.setHuman(human); 29 | binding.btnSearch.setOnClickListener(this); 30 | } 31 | 32 | @Override 33 | public void onClick(View v) { 34 | binding.btnSearch.setText(human.name.get()); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /app/src/main/java/com/lihang/databindinglover/ui/IncludeActivity.java: -------------------------------------------------------------------------------- 1 | package com.lihang.databindinglover.ui; 2 | 3 | import android.database.DatabaseUtils; 4 | import android.os.Bundle; 5 | 6 | import com.lihang.databindinglover.R; 7 | import com.lihang.databindinglover.bean.User; 8 | import com.lihang.databindinglover.databinding.ActivityIncludeBinding; 9 | 10 | import androidx.annotation.Nullable; 11 | import androidx.appcompat.app.AppCompatActivity; 12 | import androidx.databinding.DataBindingUtil; 13 | 14 | /** 15 | * Created by leo 16 | * on 2019/9/29. 17 | */ 18 | public class IncludeActivity extends AppCompatActivity { 19 | ActivityIncludeBinding binding; 20 | 21 | @Override 22 | protected void onCreate(@Nullable Bundle savedInstanceState) { 23 | super.onCreate(savedInstanceState); 24 | setContentView(R.layout.activity_include); 25 | binding = DataBindingUtil.setContentView(this, R.layout.activity_include); 26 | User user = new User("我爱学习", 18); 27 | binding.setUser(user); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /app/src/main/java/com/lihang/databindinglover/ui/ObservableCollectionActivity.java: -------------------------------------------------------------------------------- 1 | package com.lihang.databindinglover.ui; 2 | 3 | import android.os.Bundle; 4 | import android.view.View; 5 | 6 | import com.lihang.databindinglover.R; 7 | import com.lihang.databindinglover.databinding.ActivityCollectionBinding; 8 | 9 | import java.util.Random; 10 | 11 | import androidx.annotation.Nullable; 12 | import androidx.appcompat.app.AppCompatActivity; 13 | import androidx.databinding.DataBindingUtil; 14 | import androidx.databinding.ObservableArrayList; 15 | import androidx.databinding.ObservableArrayMap; 16 | import androidx.databinding.ObservableList; 17 | import androidx.databinding.ObservableMap; 18 | 19 | /** 20 | * Created by leo 21 | * on 2019/9/26. 22 | */ 23 | public class ObservableCollectionActivity extends AppCompatActivity implements View.OnClickListener { 24 | ActivityCollectionBinding binding; 25 | private ObservableList list = new ObservableArrayList<>(); 26 | private ObservableMap map = new ObservableArrayMap<>(); 27 | 28 | 29 | @Override 30 | protected void onCreate(@Nullable Bundle savedInstanceState) { 31 | super.onCreate(savedInstanceState); 32 | setContentView(R.layout.activity_collection); 33 | binding = DataBindingUtil.setContentView(this, R.layout.activity_collection); 34 | binding.setOnClickListener(this); 35 | list.add("list的值"); 36 | map.put("name", "map的值"); 37 | binding.setList(list); 38 | binding.setMap(map); 39 | binding.setIndex(0); 40 | binding.setKey("name"); 41 | } 42 | 43 | @Override 44 | public void onClick(View v) { 45 | int randowInt = new Random().nextInt(100); 46 | switch (v.getId()){ 47 | case R.id.btn_index: 48 | //改变list的第一项 49 | list.add(0,"list的值" + randowInt); 50 | break; 51 | case R.id.btn_key: 52 | map.put("name","map的值" + randowInt); 53 | break; 54 | } 55 | } 56 | } 57 | -------------------------------------------------------------------------------- /app/src/main/java/com/lihang/databindinglover/ui/ObservableFieldActivity.java: -------------------------------------------------------------------------------- 1 | package com.lihang.databindinglover.ui; 2 | 3 | import android.os.Bundle; 4 | import android.view.View; 5 | 6 | import com.lihang.databindinglover.R; 7 | import com.lihang.databindinglover.bean.Human; 8 | import com.lihang.databindinglover.databinding.ActivityObservablefieldBinding; 9 | 10 | import androidx.annotation.Nullable; 11 | import androidx.appcompat.app.AppCompatActivity; 12 | import androidx.databinding.DataBindingUtil; 13 | 14 | /** 15 | * Created by leo 16 | * on 2019/9/26. 17 | */ 18 | public class ObservableFieldActivity extends AppCompatActivity implements View.OnClickListener { 19 | ActivityObservablefieldBinding binding; 20 | private Human human; 21 | 22 | @Override 23 | protected void onCreate(@Nullable Bundle savedInstanceState) { 24 | super.onCreate(savedInstanceState); 25 | setContentView(R.layout.activity_observablefield); 26 | binding = DataBindingUtil.setContentView(this, R.layout.activity_observablefield); 27 | binding.setOnClickListener(this); 28 | human = new Human("小新", 3); 29 | binding.setHuman(human); 30 | } 31 | 32 | @Override 33 | public void onClick(View v) { 34 | switch (v.getId()) { 35 | case R.id.btn_name: 36 | human.name.set("玉玑子"); 37 | break; 38 | case R.id.btn_age: 39 | human.age.set(15); 40 | break; 41 | } 42 | } 43 | } 44 | -------------------------------------------------------------------------------- /app/src/main/java/com/lihang/databindinglover/ui/RecyclerViewActivity.java: -------------------------------------------------------------------------------- 1 | package com.lihang.databindinglover.ui; 2 | 3 | import android.os.Bundle; 4 | 5 | import com.lihang.databindinglover.R; 6 | import com.lihang.databindinglover.adapter.SimpleAdapter; 7 | import com.lihang.databindinglover.databinding.ActivityRecyclerviewBinding; 8 | 9 | import java.util.ArrayList; 10 | 11 | import androidx.annotation.Nullable; 12 | import androidx.appcompat.app.AppCompatActivity; 13 | import androidx.databinding.DataBindingUtil; 14 | 15 | /** 16 | * Created by leo 17 | * on 2019/9/26. 18 | */ 19 | public class RecyclerViewActivity extends AppCompatActivity { 20 | private ActivityRecyclerviewBinding binding; 21 | private SimpleAdapter adapter; 22 | private ArrayList arrayList = new ArrayList<>(); 23 | 24 | @Override 25 | protected void onCreate(@Nullable Bundle savedInstanceState) { 26 | super.onCreate(savedInstanceState); 27 | setContentView(R.layout.activity_recyclerview); 28 | binding = DataBindingUtil.setContentView(this, R.layout.activity_recyclerview); 29 | for (int i = 0; i < 10; i++) { 30 | arrayList.add(""); 31 | } 32 | adapter = new SimpleAdapter(); 33 | adapter.setDataList(arrayList); 34 | binding.recyclerView.setAdapter(adapter); 35 | } 36 | } 37 | -------------------------------------------------------------------------------- /app/src/main/java/com/lihang/databindinglover/ui/ViewStubActivity.java: -------------------------------------------------------------------------------- 1 | package com.lihang.databindinglover.ui; 2 | 3 | import android.os.Bundle; 4 | 5 | import com.lihang.databindinglover.R; 6 | import com.lihang.databindinglover.bean.User; 7 | import com.lihang.databindinglover.databinding.ActivityViewstubBinding; 8 | 9 | import androidx.annotation.Nullable; 10 | import androidx.appcompat.app.AppCompatActivity; 11 | import androidx.databinding.DataBindingUtil; 12 | 13 | /** 14 | * Created by leo 15 | * on 2019/9/29. 16 | */ 17 | public class ViewStubActivity extends AppCompatActivity { 18 | ActivityViewstubBinding binding; 19 | 20 | @Override 21 | protected void onCreate(@Nullable Bundle savedInstanceState) { 22 | super.onCreate(savedInstanceState); 23 | setContentView(R.layout.activity_viewstub); 24 | binding = DataBindingUtil.setContentView(this, R.layout.activity_viewstub); 25 | User user = new User("我爱学习", 18); 26 | binding.viewStub.getViewStub().inflate(); 27 | binding.setUser(user); 28 | } 29 | } 30 | -------------------------------------------------------------------------------- /app/src/main/java/com/lihang/databindinglover/utils/ActivityUtils.java: -------------------------------------------------------------------------------- 1 | package com.lihang.databindinglover.utils; 2 | 3 | import android.content.Context; 4 | import android.content.Intent; 5 | 6 | /** 7 | * Created by leo 8 | * on 2019/9/24. 9 | */ 10 | public class ActivityUtils { 11 | //简单跳转 12 | public static void transfer(Context context, Class clazz) { 13 | Intent intent = new Intent(context, clazz); 14 | context.startActivity(intent); 15 | } 16 | } 17 | -------------------------------------------------------------------------------- /app/src/main/java/com/lihang/databindinglover/utils/DataBindingHelper.java: -------------------------------------------------------------------------------- 1 | package com.lihang.databindinglover.utils; 2 | 3 | import android.widget.ImageView; 4 | import android.widget.TextView; 5 | 6 | import com.bumptech.glide.Glide; 7 | import com.lihang.databindinglover.R; 8 | 9 | import androidx.databinding.BindingAdapter; 10 | 11 | import static com.bumptech.glide.load.resource.drawable.DrawableTransitionOptions.withCrossFade; 12 | 13 | /** 14 | * Created by leo 15 | * on 2019/9/29. 16 | */ 17 | public class DataBindingHelper { 18 | @BindingAdapter("imageWithGlide") 19 | public static void loadImage(ImageView imageView, String url) { 20 | Glide.with(imageView).load(url) 21 | .placeholder(R.mipmap.ic_launcher) 22 | .error(R.mipmap.ic_launcher) 23 | .transition(withCrossFade()) 24 | .centerCrop() 25 | .into(imageView); 26 | } 27 | 28 | // @BindingAdapter("android:text") 29 | // public static void setText(TextView textView, String testStr) { 30 | // textView.setText(testStr + " - 我是通过方法加的"); 31 | // } 32 | } 33 | -------------------------------------------------------------------------------- /app/src/main/java/com/lihang/databindinglover/utils/OnClickStaticUtil.java: -------------------------------------------------------------------------------- 1 | package com.lihang.databindinglover.utils; 2 | 3 | import android.view.View; 4 | import android.widget.Toast; 5 | 6 | /** 7 | * Created by leo 8 | * on 2019/9/17. 9 | */ 10 | public class OnClickStaticUtil { 11 | 12 | public static void onClickWithMe(View view) { 13 | Toast.makeText(view.getContext(), "直接调用静态方法", Toast.LENGTH_SHORT).show(); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /app/src/main/java/com/lihang/databindinglover/utils/OnClickUtil.java: -------------------------------------------------------------------------------- 1 | package com.lihang.databindinglover.utils; 2 | 3 | import android.view.View; 4 | import android.widget.Toast; 5 | 6 | /** 7 | * Created by leo 8 | * on 2019/9/17. 9 | */ 10 | public class OnClickUtil { 11 | 12 | public void onClickWithMe(View view) { 13 | Toast.makeText(view.getContext(), "调用类里的方法", Toast.LENGTH_SHORT).show(); 14 | } 15 | } 16 | -------------------------------------------------------------------------------- /app/src/main/java/com/lihang/databindinglover/utils/ToastUtils.java: -------------------------------------------------------------------------------- 1 | package com.lihang.databindinglover.utils; 2 | 3 | import android.content.Context; 4 | import android.widget.Toast; 5 | 6 | import com.lihang.databindinglover.MyApplication; 7 | 8 | 9 | /** 10 | * Created by leo on 2017/9/4. 11 | * 防止重复点击toast,一直显示未隐藏 12 | */ 13 | 14 | public class ToastUtils { 15 | private static Context context = MyApplication.getInstance().getApplicationContext(); 16 | /** 之前显示的内容 */ 17 | private static String oldMsg ; 18 | /** Toast对象 */ 19 | private static Toast toast = null ; 20 | /** 第一次时间 */ 21 | private static long oneTime = 0 ; 22 | /** 第二次时间 */ 23 | private static long twoTime = 0 ; 24 | 25 | /** 26 | * 显示Toast 27 | * @param message 28 | */ 29 | public static void showToast(String message){ 30 | if(toast == null){ 31 | toast = Toast.makeText(context, message, Toast.LENGTH_SHORT); 32 | toast.show() ; 33 | oneTime = System.currentTimeMillis() ; 34 | }else{ 35 | twoTime = System.currentTimeMillis() ; 36 | if(message.equals(oldMsg)){ 37 | if(twoTime - oneTime > Toast.LENGTH_SHORT){ 38 | toast.show() ; 39 | } 40 | }else{ 41 | oldMsg = message ; 42 | toast.setText(message) ; 43 | toast.show() ; 44 | } 45 | } 46 | oneTime = twoTime ; 47 | } 48 | 49 | } 50 | -------------------------------------------------------------------------------- /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_alis.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 7 | 8 | 11 | 12 | 15 | 16 | 19 | 20 | 21 | 25 | 30 | 35 | 36 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_baseobservable.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 8 | 9 | 12 | 13 | 14 | 15 | 20 | 25 | 26 | 31 | 32 | 33 |