From 3fcb15bfdb606fbc7b6aedff8d14bc1ae5da3839 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8A=B7=E8=A1=8C?= Date: Thu, 23 Jul 2015 10:41:53 +0800 Subject: [PATCH 1/5] add gitignore file --- .gitignore | 33 ++++++++++++++++++++------------- 1 file changed, 20 insertions(+), 13 deletions(-) diff --git a/.gitignore b/.gitignore index b3aa297..759bac7 100644 --- a/.gitignore +++ b/.gitignore @@ -1,34 +1,41 @@ -# Built application files +# built application files *.apk *.ap_ -# Files for the Dalvik VM +# files for the dex VM *.dex # Java class files *.class -# Generated files +# generated files bin/ gen/ +out/ -# Gradle files +# Intellij project files +*.iml +*.ipr +*.iws +.idea/ + +# Ignore gradle files .gradle/ build/ -/*/build/ +gradle/ +gradlew +gradlew.bat # Local configuration file (sdk path, etc) local.properties +project.properties + +# Eclipse project files +.classpath +.project # Proguard folder generated by Eclipse proguard/ -# Log Files +# Log files *.log -.gradle -/local.properties -/.idea/workspace.xml -/.idea/libraries -.DS_Store -/build -/captures From 352860112ea051d14f8e23acd9a9051b905b3ecf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8A=B7=E8=A1=8C?= Date: Thu, 23 Jul 2015 10:52:01 +0800 Subject: [PATCH 2/5] add two examples in dynamic and attributesetters --- .../databindingsamples/MainActivity.java | 1 + .../AttributeSettersActivity.java | 52 ++++++++++---- .../databindingsamples/basic/User.java | 16 ++++- .../dynamic/DynamicActivity.java | 61 ++++++++++++++-- .../databindingsamples/dynamic/MyAdapter.java | 9 +-- .../dynamic/ObservableAdapter.java | 70 +++++++++++++++++++ .../observable/ObservableActivity.java | 1 + .../observable/ObservableUser.java | 10 +++ .../observable/PlainUser.java | 6 +- .../resources/ResourceActivity.java | 2 +- .../res/layout/activity_attribute_setters.xml | 2 +- .../res/layout/activity_custom_binding.xml | 1 - app/src/main/res/layout/activity_dynamic.xml | 6 ++ .../main/res/layout/list_item_observable.xml | 23 ++++++ 14 files changed, 230 insertions(+), 30 deletions(-) create mode 100644 app/src/main/java/com/liangfeizc/databindingsamples/dynamic/ObservableAdapter.java create mode 100644 app/src/main/res/layout/list_item_observable.xml diff --git a/app/src/main/java/com/liangfeizc/databindingsamples/MainActivity.java b/app/src/main/java/com/liangfeizc/databindingsamples/MainActivity.java index fbdb252..62f6ed0 100644 --- a/app/src/main/java/com/liangfeizc/databindingsamples/MainActivity.java +++ b/app/src/main/java/com/liangfeizc/databindingsamples/MainActivity.java @@ -7,6 +7,7 @@ import android.view.Menu; import android.view.MenuItem; import android.view.View; +import android.widget.Toast; import com.liangfeizc.databindingsamples.attributesetters.AttributeSettersActivity; import com.liangfeizc.databindingsamples.basic.BasicActivity; diff --git a/app/src/main/java/com/liangfeizc/databindingsamples/attributesetters/AttributeSettersActivity.java b/app/src/main/java/com/liangfeizc/databindingsamples/attributesetters/AttributeSettersActivity.java index cbe342f..b4138ec 100644 --- a/app/src/main/java/com/liangfeizc/databindingsamples/attributesetters/AttributeSettersActivity.java +++ b/app/src/main/java/com/liangfeizc/databindingsamples/attributesetters/AttributeSettersActivity.java @@ -14,27 +14,55 @@ import com.squareup.picasso.Picasso; public class AttributeSettersActivity extends BaseActivity { + private ActivityAttributeSettersBinding binding; private static final String TAG = "AttributeSetters"; public static final String IMG_URL = "http://tvfan.kyodo.co.jp/wp-content/uploads/2015/01/15027b37a4104edd85fb5b79a6c9e3ac-344x516.jpg"; - public View.OnClickListener clickListener = new View.OnClickListener() { - @Override - public void onClick(View v) { - Toast.makeText( - getApplicationContext(), - "User view is clicked", - Toast.LENGTH_LONG).show(); - } - }; + public View.OnClickListener clickListener,firstClickListener,secondClickListener; + private static boolean ifFirst = true; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); - ActivityAttributeSettersBinding binding = - DataBindingUtil.setContentView(this, R.layout.activity_attribute_setters); - + binding = DataBindingUtil.setContentView(this, R.layout.activity_attribute_setters); + initListener(); binding.setActivity(this); binding.setImageUrl(IMG_URL); + + } + + private void initListener() { + firstClickListener = new View.OnClickListener() { + @Override + public void onClick(View v) { + Toast.makeText( + getApplicationContext(), + "User view is clicked-first", + Toast.LENGTH_SHORT).show(); + changeListener(); + + } + }; + + secondClickListener = new View.OnClickListener() { + @Override + public void onClick(View v) { + Toast.makeText( + getApplicationContext(), + "User view is clicked-second", + Toast.LENGTH_SHORT).show(); + changeListener(); + } + }; + + clickListener = firstClickListener; + } + + private void changeListener() { + ifFirst = !ifFirst; + clickListener = (ifFirst)? firstClickListener: secondClickListener; + //如果没有binding的setActivity,则无法刷新clicklistener + binding.setActivity(this); } @BindingAdapter({"bind:imageUrl", "bind:error"}) diff --git a/app/src/main/java/com/liangfeizc/databindingsamples/basic/User.java b/app/src/main/java/com/liangfeizc/databindingsamples/basic/User.java index bcc517e..a52e762 100644 --- a/app/src/main/java/com/liangfeizc/databindingsamples/basic/User.java +++ b/app/src/main/java/com/liangfeizc/databindingsamples/basic/User.java @@ -4,8 +4,8 @@ * Created by rufi on 6/2/15. */ public class User { - private final String firstName; - private final String lastName; + private String firstName; + private String lastName; private String displayName; private int age; @@ -38,4 +38,16 @@ public String getDisplayName() { public boolean isAdult() { return age >= 18; } + + public void setFirstName(String firstName) { + this.firstName = firstName; + } + + public void setLastName(String lastName) { + this.lastName = lastName; + } + + public void setAge(int age) { + this.age = age; + } } diff --git a/app/src/main/java/com/liangfeizc/databindingsamples/dynamic/DynamicActivity.java b/app/src/main/java/com/liangfeizc/databindingsamples/dynamic/DynamicActivity.java index 0fb6f25..ab01343 100644 --- a/app/src/main/java/com/liangfeizc/databindingsamples/dynamic/DynamicActivity.java +++ b/app/src/main/java/com/liangfeizc/databindingsamples/dynamic/DynamicActivity.java @@ -1,21 +1,30 @@ package com.liangfeizc.databindingsamples.dynamic; import android.databinding.DataBindingUtil; -import android.support.v7.app.AppCompatActivity; import android.os.Bundle; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; -import android.view.Menu; -import android.view.MenuItem; +import android.view.View; import com.liangfeizc.databindingsamples.BaseActivity; import com.liangfeizc.databindingsamples.R; +import com.liangfeizc.databindingsamples.basic.User; import com.liangfeizc.databindingsamples.databinding.ActivityDynamicBinding; +import com.liangfeizc.databindingsamples.observable.ObservableUser; + +import java.util.ArrayList; +import java.util.List; public class DynamicActivity extends BaseActivity { + /** + * 可以选择使用普通user模式(需要set);或者用观察者ObservableUser模式(不需要set,自动刷新view) + */ + private static final boolean IF_OBSERVABLE = true; private RecyclerView mRecyclerView; private RecyclerView.Adapter mAdapter; private RecyclerView.LayoutManager mLayoutManager; + private List users; + private List observableUsers; @Override protected void onCreate(Bundle savedInstanceState) { @@ -31,8 +40,52 @@ protected void onCreate(Bundle savedInstanceState) { mLayoutManager = new LinearLayoutManager(this); mRecyclerView.setLayoutManager(mLayoutManager); - mAdapter = new MyAdapter(); + initData(); + mRecyclerView.setAdapter(mAdapter); } + + private void initData() { + if (IF_OBSERVABLE){ + initObservableUserData(); + } + else { + initUserData(); + } + } + + private void initObservableUserData() { + observableUsers = new ArrayList<>(10); + for (int i = 0; i < 10;i ++) { + ObservableUser user = new ObservableUser("liang", "fei"); + observableUsers.add(user); + } + mAdapter = new ObservableAdapter(observableUsers); + } + + private void initUserData() { + users = new ArrayList<>(10); + for (int i = 0; i < 10;i ++) { + User user = new User("liang", "fei"); + users.add(user); + } + mAdapter = new MyAdapter(users); + } + + public void changeList(View v){ + if (IF_OBSERVABLE) { + observableUsers.get(3).setLastName("Huang"); + observableUsers.get(3).setFirstName("Jue"); + //对于ObservableUser如果数据改变,则view自动刷新 + } + else{ + users.get(3).setLastName("Huang"); + users.get(3).setFirstName("Jue"); + //对于普通user必须用notify才可以刷新view + mAdapter.notifyDataSetChanged(); + } + + } + } diff --git a/app/src/main/java/com/liangfeizc/databindingsamples/dynamic/MyAdapter.java b/app/src/main/java/com/liangfeizc/databindingsamples/dynamic/MyAdapter.java index c081641..1e9529e 100644 --- a/app/src/main/java/com/liangfeizc/databindingsamples/dynamic/MyAdapter.java +++ b/app/src/main/java/com/liangfeizc/databindingsamples/dynamic/MyAdapter.java @@ -20,12 +20,8 @@ public class MyAdapter extends RecyclerView.Adapter { private List users; - public MyAdapter() { - users = new ArrayList<>(10); - for (int i = 0; i < 10;i ++) { - User user = new User("liang", "fei"); - users.add(user); - } + public MyAdapter(List mUsers) { + users = mUsers; } public static class BindingHolder extends RecyclerView.ViewHolder { private ViewDataBinding binding; @@ -61,6 +57,7 @@ public BindingHolder onCreateViewHolder(ViewGroup viewGroup, int i) { public void onBindViewHolder(BindingHolder holder, int position) { User user = users.get(position); holder.getBinding().setVariable(BR.user, user); + //executePendingBindings用于在主线程刷新view,如果不加这句话,则可以在后台刷新 holder.getBinding().executePendingBindings(); } diff --git a/app/src/main/java/com/liangfeizc/databindingsamples/dynamic/ObservableAdapter.java b/app/src/main/java/com/liangfeizc/databindingsamples/dynamic/ObservableAdapter.java new file mode 100644 index 0000000..b57ad05 --- /dev/null +++ b/app/src/main/java/com/liangfeizc/databindingsamples/dynamic/ObservableAdapter.java @@ -0,0 +1,70 @@ +package com.liangfeizc.databindingsamples.dynamic; + +import android.databinding.DataBindingUtil; +import android.databinding.ViewDataBinding; +import android.support.v7.widget.RecyclerView; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; + +import com.liangfeizc.databindingsamples.BR; +import com.liangfeizc.databindingsamples.R; +import com.liangfeizc.databindingsamples.observable.ObservableUser; + +import java.util.List; + +/** + * Created by rufi on 6/5/15. + */ +public class ObservableAdapter extends RecyclerView.Adapter { + private List users; + + public ObservableAdapter(List mUsers) { + users = mUsers; + } + public static class BindingHolder extends RecyclerView.ViewHolder { + private ViewDataBinding binding; + + public BindingHolder(View itemView) { + super(itemView); + } + + public ViewDataBinding getBinding() { + return binding; + } + + public void setBinding(ViewDataBinding binding) { + this.binding = binding; + } + } + + @Override + public BindingHolder onCreateViewHolder(ViewGroup viewGroup, int i) { + ViewDataBinding binding = DataBindingUtil.inflate( + LayoutInflater.from(viewGroup.getContext()), + R.layout.list_item_observable, + viewGroup, + false); + + BindingHolder holder = new BindingHolder(binding.getRoot()); + holder.setBinding(binding); + + return holder; + } + + @Override + public void onBindViewHolder(BindingHolder holder, int position) { + ObservableUser user = users.get(position); + holder.getBinding().setVariable(BR.user, user); + + //holder.getBinding().executePendingBindings(); + } + + @Override + public int getItemCount() { + return users.size(); + } + + +} + diff --git a/app/src/main/java/com/liangfeizc/databindingsamples/observable/ObservableActivity.java b/app/src/main/java/com/liangfeizc/databindingsamples/observable/ObservableActivity.java index c0f6ddf..a5e955e 100644 --- a/app/src/main/java/com/liangfeizc/databindingsamples/observable/ObservableActivity.java +++ b/app/src/main/java/com/liangfeizc/databindingsamples/observable/ObservableActivity.java @@ -33,6 +33,7 @@ public void setOtherName(View view) { user.setFirstName("zhu"); user.setLastName("chen"); + plainUser.firstName.set("zhu"); plainUser.lastName.set("chen"); plainUser.age.set(27); diff --git a/app/src/main/java/com/liangfeizc/databindingsamples/observable/ObservableUser.java b/app/src/main/java/com/liangfeizc/databindingsamples/observable/ObservableUser.java index d034be0..cddcd65 100644 --- a/app/src/main/java/com/liangfeizc/databindingsamples/observable/ObservableUser.java +++ b/app/src/main/java/com/liangfeizc/databindingsamples/observable/ObservableUser.java @@ -12,6 +12,16 @@ public class ObservableUser extends BaseObservable { private String firstName; private String lastName; + public ObservableUser() { + } + + public ObservableUser(String firstName, String lastName) { + this.firstName = firstName; + this.lastName = lastName; + notifyPropertyChanged(BR.firstName); + notifyPropertyChanged(BR.lastName); + } + @Bindable public String getFirstName() { return firstName; diff --git a/app/src/main/java/com/liangfeizc/databindingsamples/observable/PlainUser.java b/app/src/main/java/com/liangfeizc/databindingsamples/observable/PlainUser.java index 6f86402..c9978db 100644 --- a/app/src/main/java/com/liangfeizc/databindingsamples/observable/PlainUser.java +++ b/app/src/main/java/com/liangfeizc/databindingsamples/observable/PlainUser.java @@ -8,7 +8,7 @@ * Created by rufi on 6/3/15. */ public class PlainUser { - public final ObservableField firstName = new ObservableField<>(); - public final ObservableField lastName = new ObservableField<>(); - public final ObservableInt age = new ObservableInt(); + public ObservableField firstName = new ObservableField<>(); + public ObservableField lastName = new ObservableField<>(); + public ObservableInt age = new ObservableInt(); } diff --git a/app/src/main/java/com/liangfeizc/databindingsamples/resources/ResourceActivity.java b/app/src/main/java/com/liangfeizc/databindingsamples/resources/ResourceActivity.java index 8e64dad..18e5cbe 100644 --- a/app/src/main/java/com/liangfeizc/databindingsamples/resources/ResourceActivity.java +++ b/app/src/main/java/com/liangfeizc/databindingsamples/resources/ResourceActivity.java @@ -24,6 +24,6 @@ protected void onCreate(Bundle savedInstanceState) { binding.setLastName("fei"); binding.setBananaCount(2); - binding.setOrangeCount(10); + binding.setOrangeCount(0); } } diff --git a/app/src/main/res/layout/activity_attribute_setters.xml b/app/src/main/res/layout/activity_attribute_setters.xml index 3ef72b8..a8b9235 100644 --- a/app/src/main/res/layout/activity_attribute_setters.xml +++ b/app/src/main/res/layout/activity_attribute_setters.xml @@ -21,7 +21,7 @@ diff --git a/app/src/main/res/layout/activity_custom_binding.xml b/app/src/main/res/layout/activity_custom_binding.xml index a53ac87..68c4352 100644 --- a/app/src/main/res/layout/activity_custom_binding.xml +++ b/app/src/main/res/layout/activity_custom_binding.xml @@ -1,7 +1,6 @@ - diff --git a/app/src/main/res/layout/activity_dynamic.xml b/app/src/main/res/layout/activity_dynamic.xml index 45c1d2b..6bd852a 100644 --- a/app/src/main/res/layout/activity_dynamic.xml +++ b/app/src/main/res/layout/activity_dynamic.xml @@ -7,5 +7,11 @@ android:id="@+id/recycler_view" android:layout_width="match_parent" android:layout_height="match_parent" /> +