Animal.java
package com.example.administrator.databindtext12225;import android.databinding.ObservableField;import android.databinding.ObservableInt;/** * Created by Administrator on 2016/11/27 0027. */public class Animal { public final ObservableField<String> field = new ObservableField<>(); public final ObservableInt age = new ObservableInt();}user.java
package com.example.administrator.databindtext12225;import android.databinding.BaSEObservable;import android.databinding.Bindable;/** * Created by Administrator on 2016/12/25 0025. */public class User extends BaseObservable{ PRivate String name; private String address; private int age; @Bindable public String getName() { return name; } public void setName(String name) { this.name = name; //和bindable配对使用// notifyPropertyChanged(com.example.administrator.databindtext.BR.name); notifyPropertyChanged(com.example.administrator.databindtext12225.BR.name); } @Bindable public String getAddress() { return address; } public void setAddress(String address) { this.address = address; notifyPropertyChanged(com.example.administrator.databindtext12225.BR.address); } public int getAge() { return age; } public void setAge(int age) { this.age = age; }}other/user.java
package com.example.administrator.databindtext12225.other;import android.databinding.BaseObservable;/** * Created by Administrator on 2016/12/25 0025. */public class User extends BaseObservable{ private String daxiongName; private String daxiongAddress; private int daxiongAge; public String getDaxiongName() { return daxiongName; } public void setDaxiongName(String daxiongName) { this.daxiongName = daxiongName; } public String getDaxiongAddress() { return daxiongAddress; } public void setDaxiongAddress(String daxiongAddress) { this.daxiongAddress = daxiongAddress; } public int getDaxiongAge() { return daxiongAge; } public void setDaxiongAge(int daxiongAge) { this.daxiongAge = daxiongAge; }}//student.java
import android.databinding.BaseObservable;import android.databinding.ObservableBoolean;import android.databinding.ObservableField;/** * Created by Administrator on 2016/12/25 0025. */public class Student extends BaseObservable{ public ObservableField<String> stuName = new ObservableField<>(); public ObservableBoolean isMan = new ObservableBoolean(); private String stuAge; public String getStuAge() { return stuAge; } public void setStuAge(String stuAge) { this.stuAge = stuAge; }}MyAdapter.java
package com.example.administrator.databindtext12225;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 java.util.ArrayList;/** * Created by Administrator on 2016/12/25 0025. */public class MyAdapter extends RecyclerView.Adapter { private ArrayList<Student> mData = new ArrayList<>(); public MyAdapter(ArrayList<Student> data) { mData.addAll(data); } @Override public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { ViewDataBinding binding = DataBindingUtil.inflate(LayoutInflater .from(parent.getContext()), R.layout.item_recycleview, parent, false); ViewHolder holder = new ViewHolder(binding.getRoot()); holder.setBinding(binding); return holder; } /** * ViewDataBinding是我们之前用的那些binding的父类,只有自动生成的那些子类才会有setXXX方法,那现在我们需要在ViewDataBinding中设置变量咋办?这个类为我们提供了setVariable去设置变量,第一个参数是我们的变量名的引用,第二个是我们要设置的值 *当数据改变时,binding会在下一帧去改变数据,如果我们需要立即改变,就去调用executePendingBindings方法 * */ @Override public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { ((ViewHolder)holder).getBinding().setVariable(com.example.administrator.databindtext12225.BR.stu,mData.get(position)); ((ViewHolder)holder).getBinding().executePendingBindings(); ((ViewHolder)holder).getBinding().setVariable(com.example.administrator.databindtext12225.BR.drawableId,R.mipmap.ic_launcher); } @Override public int getItemCount() { return mData.size(); } class ViewHolder extends RecyclerView.ViewHolder { private ViewDataBinding binding; public ViewHolder(View itemView) { super(itemView); } public void setBinding(ViewDataBinding binding) { this.binding = binding; } public ViewDataBinding getBinding() { return this.binding; } }}Utill.java
package com.example.administrator.databindtext12225;import android.databinding.BindingAdapter;import android.widget.ImageView;/** * Created by Administrator on 2016/12/25 0025. */public class Utils { @BindingAdapter({"bind:image"}) public static void imageLoader(ImageView imageView, int drawableId) { imageView.setBackgroundResource(drawableId); }}二.Mainactivity.java
/** * 这里主要写的是怎么把 * 1.对象 和 基本数据类型 跟view绑定 * 2.给include的布局 传递对象 * 3.@{user.displayName ?? user.lastName 如果不是null 就是自身,如果是null就是user.lastName * 4. * <TextView android:layout_width="wrap_content" * android:layout_height="wrap_content" * android:text="@{user.firstName, default=超哥}"/> * 5.如何 import 相同类名的class */public class MainActivity extends AppCompatActivity implements View.OnClickListener { private User mUser; private com.example.administrator.databindtext12225.other.User mOtherUser; private ActivityMainBinding mBinding; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mBinding = DataBindingUtil.setContentView(this, R.layout.activity_main); mUser = new User(); mUser.setName("超哥"); mUser.setAddress("北一峰"); mOtherUser = new com.example.administrator.databindtext12225.other.User(); mOtherUser.setDaxiongName("我是大雄"); mOtherUser.setDaxiongAddress("南一峰"); mBinding.setUser(mUser); mBinding.setOtheruser(mOtherUser); //editText 输入完成改变对象 mBinding.btOtherUserConfirm.setOnClickListener(this); mBinding.btUserConfirm.setOnClickListener(this); //跳转到SecondActivity mBinding.btJump.setOnClickListener(this); } @Override public void onClick(View view) { if (view == mBinding.btUserConfirm) { System.out.println("xcqw btUserConfirm name" + mBinding.etUserName.getText().toString() + " address " + mBinding.etUserAddress.getText().toString());// 方法1: 这种不会立即改变View (user没有继承baseObservale)// mUser.setName(mBinding.etUserName.getText().toString());// mUser.setAddress(mBinding.etUserAddress.getText().toString());// 方法2: 这种就会立即改变View(也就是重新设置一个user)// User user = new User();// user.setName(mBinding.etUserName.getText().toString());// user.setAddress(mBinding.etUserAddress.getText().toString());// mBinding.setUser(user);// 方法3: 会立即改变View// 1.user extends baseobservable// 2.在get方法上@bindable// 3.在set方法notifyPropertyChanged mUser.setName(mBinding.etUserName.getText().toString()); mUser.setAddress(mBinding.etUserAddress.getText().toString()); } else if (view == mBinding.btOtherUserConfirm) {// 方法1: 这种不会立即改变View// System.out.println("xcqw btOtherUserConfirm name"+mBinding.etOtherUserName.getText().toString()+" address "+mBinding.etOtherUserAddress.getText().toString());// mOtherUser.setDaxiongName(mBinding.etOtherUserName.getText().toString());// mOtherUser.setDaxiongAddress(mBinding.etOtherUserAddress.getText().toString());// 方法2: 这种就会立即改变View com.example.administrator.databindtext12225.other.User user = new com.example.administrator.databindtext12225.other.User(); user.setDaxiongName(mBinding.etOtherUserName.getText().toString()); user.setDaxiongAddress(mBinding.etOtherUserAddress.getText().toString()); mBinding.setOtheruser(user); } else if (view == mBinding.btJump) { startActivity(new Intent(MainActivity.this, SecondActivity.class)); } }}Activity_main.xml<?xml version="1.0" encoding="utf-8"?><layout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:bind="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools"> <data> <variable name="user" type="com.example.administrator.databindtext12225.User"> </variable> <!--因为type="User"都为User类,会导致不知道到那个包,所以可以通过alias属性重命名type的类型--> <import alias="Other" type="com.example.administrator.databindtext12225.other.User"/> <variable name="otheruser" type="Other"> </variable> </data> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <include layout="@layout/include_layout" bind:user="@{user}" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" tools:context="com.example.administrator.databindtext12225.MainActivity"> <TextView android:id="@+id/tv_user_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{`userName`+user.name}"/> <TextView android:id="@+id/tv_user_address" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{`userAddress`+user.address}"/> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" tools:context="com.example.administrator.databindtext12225.MainActivity"> <TextView android:id="@+id/tv_other_user_name" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{`otherUserName`+otheruser.daxiongName}"/> <TextView android:id="@+id/tv_other_user_address" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{`otherUserAddress`+otheruser.daxiongAddress}"/> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <EditText android:id="@+id/et_user_name" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="请输入user的name"/> <EditText android:id="@+id/et_user_address" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="请输入user的address"/> <Button android:id="@+id/bt_user_confirm" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="确认输入,改变userView"/> </LinearLayout> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <EditText android:id="@+id/et_other_user_name" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="请输入otheruser的name"/> <EditText android:id="@+id/et_other_user_address" android:layout_width="match_parent" android:layout_height="wrap_content" android:hint="请输入otheruser的address"/> <Button android:id="@+id/bt_other_user_confirm" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="确认输入,改变otherUserView"/> </LinearLayout> <Button android:id="@+id/bt_jump" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="跳到SecondActivity"/> </LinearLayout></layout>二.SecondActivity.java
** * 1.一些特殊字符的转义,<String> 左右尖括号的写法 * 2.对象绑定的另外一种方法 属性都用observal * 3.arrayList,map绑定的方法 * 4.map的两种写法 * normalMap.get(`age`) * map[`name`] * 5.在布局文件中可以用``拼接字符串 * */public class SecondActivity extends AppCompatActivity { private ActivitySecondBinding mBinding; private ObservableArrayList<com.example.administrator.databindtext12225.other.User> arrayList; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mBinding = DataBindingUtil.setContentView(SecondActivity.this, R.layout.activity_second);//第一部分 普通的写法不会直接互相绑定// final ArrayList<String> normalList = new ArrayList<>();// normalList.add("first");// normalList.add("second");// mBinding.setNormalList(normalList);//// final Map<String, String> normalMap = new HashMap<>();// normalMap.put("name", "zhangsan");// normalMap.put("age", "40");// mBinding.setNormalMap(normalMap);//// final String[] normalArrays = {"lisi", "laowang"};// mBinding.setNormalArrays(normalArrays); //第二部分 这么写才会互相绑定 final Animal animal = new Animal(); animal.field.set("cat"); animal.age.set(2); mBinding.setAnimal(animal); arrayList = new ObservableArrayList<>(); for (int i=0;i<2;i++){ com.example.administrator.databindtext12225.other.User user = new com.example.administrator.databindtext12225.other.User(); user.setDaxiongName("大熊"+i+"号"); arrayList.add(user); } mBinding.setUserList(arrayList); final ObservableArrayList<String> list = new ObservableArrayList<>(); list.add("daxiong"); list.add("daxiong2"); mBinding.setList(list); final ObservableArrayMap<String, String> map = new ObservableArrayMap<>(); map.put("name","Tom"); map.put("age","4"); mBinding.setMap(map); mBinding.btChangeValue.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) {// 第一部分 这么写不会互相绑定// normalList.set(0,"hehe");// normalList.set(1,"haha");// normalMap.put("name","sam");// normalMap.put("age","5");// normalArrays[0] = "zhaosi"; //第二部分 //作用类型 对象的bindable animal.field.set("dog"); animal.age.set(4); list.set(0,"cat"); list.set(1,"dog"); map.put("name","Sam"); map.put("age","5"); //other/user中的属性需要加上 notifyPropertyChanged(BR.daxiongName); 才会生效,否则没用 arrayList.get(0).setDaxiongName("大熊一号改装过"); arrayList.get(1).setDaxiongName("大熊二号改装过"); } }); mBinding.btJumpThirdactivity.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { startActivity(new Intent(SecondActivity.this,ThirdActivity.class)); } }); }}Activity_second.xml<?xml version="1.0" encoding="utf-8"?><layout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" tools:context="com.example.administrator.databindtext12225.SecondActivity"> <data> <import type="java.util.ArrayList" /> <import type="java.util.Map" /> <import type="java.lang.String" /> <import type="com.example.administrator.databindtext12225.other.User" /> <variable name="secondActivity" type="com.example.administrator.databindtext12225.SecondActivity"> </variable> <!--第一部分--> <variable name="normalList" type="ArrayList<String>"/> <!--泛型的支持会在编译时期报红线,但是是可以直接运行的 但是需要通过转义字符才行,如:<数据类型> 或者<数据类型>--> <!--< < > > 貌似这个gt可以直接用> 但是<必须被替换--> <variable name="normalMap" type="Map<String,String>" /> <variable name="normalArrays" type="String[]" /> <!--第一部分结束--> <!--这么写一直报错,非要写的跟下面一样,把user拿出去!!!!--> <!--<variable--> <!--name="user"--> <!--type="com.example.administrator.databindtext12225.User">--> <!--</variable>--> <variable name="user" type="User"> </variable> <variable name="animal" type="com.example.administrator.databindtext12225.Animal"> </variable> <variable name="userList" type="android.databinding.ObservableArrayList<User>"/> <variable name="list" type="android.databinding.ObservableArrayList<String>"/> <variable name="map" type="android.databinding.ObservableArrayMap<String,String>"/> </data><LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" ><!--第一部分--> <!--<TextView--> <!--android:layout_width="wrap_content"--> <!--android:layout_height="wrap_content"--> <!--android:text="@{normalList[0]}"/>--> <!--<TextView--> <!--android:layout_width="wrap_content"--> <!--android:layout_height="wrap_content"--> <!--android:text="@{normalList[1]}"/>--> <!--<!–!!!!! `````这个符号可以凭借字符串–>--> <!--<TextView--> <!--android:layout_width="wrap_content"--> <!--android:layout_height="wrap_content"--> <!--android:text="@{normalMap.get(`age`)}"/>--> <!--<TextView--> <!--android:layout_width="wrap_content"--> <!--android:layout_height="wrap_content"--> <!--android:text="@{normalArrays[0]}"/>--> <!--第一部分结束--> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{`animal.filed`+animal.field}" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{`animal.age`+String.valueOf(animal.age)}" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{`list[0]`+list[0]}" /> <!--Map集合既可以通过map[key]的方式,也可以通过调用API--> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{`list[1]`+list[1]}" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{`map[name]`+map[`name`]}" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{`otheruserList[0]name`+userList[0].getDaxiongName}" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@{`otheruserList[1]name`+userList[1].getDaxiongName}" /> <Button android:id="@+id/bt_change_value" android:layout_width="wrap_content" android:text="改变数据" android:layout_height="wrap_content" /><Button android:id="@+id/bt_jump_thirdactivity" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="跳到ThirdActivity"/></LinearLayout></layout>三.ThirdActivity.java/** * 1.点击事件的几种写法 * */public class ThirdActivity extends AppCompatActivity { private ActivityThirdBinding mBinding; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mBinding = DataBindingUtil.setContentView(ThirdActivity.this, R.layout.activity_third); User user = new User(); user.setName("我是第三个Activity"); mBinding.setUser(user);// 第二种点击事件写法 mBinding.setClickEvent(new View.OnClickListener() { @Override public void onClick(View view) { Toast.makeText(ThirdActivity.this, "xcqw 我是第二种点击事件写法", Toast.LENGTH_SHORT).show(); } });// 第三种点击事件写法 mBinding.setMyEvent(new MyEventListener() { @Override public void clickEventOne(View view) { Toast.makeText(ThirdActivity.this, "xcqw 我是第三种写法 clickEventOne", Toast.LENGTH_SHORT).show(); } @Override public void clickEventTwo(View view) { Toast.makeText(ThirdActivity.this, "xcqw 我是第三种写法 clickEventTwo", Toast.LENGTH_SHORT).show(); } @Override public void clickEventThree(User user) { Toast.makeText(ThirdActivity.this, "xcqw 我是第三种写法 clickEventTwo username"+user.getName(), Toast.LENGTH_SHORT).show(); } }); mBinding.btJumpFouractivity.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { startActivity(new Intent(ThirdActivity.this,FourActivity.class)); } }); } public void firstMethodClick(View view){// 这种传统的点击事件写法还有好几种 Toast.makeText(ThirdActivity.this, "xcqw 我是第一种写法 firstMethodClick", Toast.LENGTH_SHORT).show(); }}activity_third.java
<?xml version="1.0" encoding="utf-8"?><layout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" tools:context="com.example.administrator.databindtext12225.SecondActivity"> <data> <variable name="view" type="android.view.View"> </variable> <variable name="user" type="com.example.administrator.databindtext12225.User"/> <variable name="clickEvent" type="android.view.View.OnClickListener" /> <variable name="myEvent" type="com.example.administrator.databindtext12225.MyEventListener"/> </data> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <Button android:id="@+id/bt_first_method" android:layout_width="match_parent" android:layout_height="wrap_content" android:onClick="firstMethodClick" android:text="第一种传统写法"/> <Button android:id="@+id/bt_second_method" android:layout_width="match_parent" android:layout_height="wrap_content" android:onClick="@{clickEvent}" android:text="第二种点击方式"/> <Button android:id="@+id/bt_third_method" android:layout_width="match_parent" android:layout_height="wrap_content" android:onClick="@{myEvent.clickEventOne}" android:text="第三种新式写法"/><!--不知道() -> myEvent.clickEventThree(user) 代表什么意思--> <Button android:id="@+id/bt_third_method_two" android:layout_width="match_parent" android:layout_height="wrap_content" android:onClick="@{() -> myEvent.clickEventThree(user)}" android:text="第三种新式写法有入参"/> <Button android:id="@+id/bt_jump_fouractivity" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="跳到fourActivity"/> </LinearLayout></layout>四.FourActivity.java
package com.example.administrator.databindtext12225;import android.databinding.DataBindingUtil;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.support.v7.widget.LinearLayoutManager;import android.view.View;import com.example.administrator.databindtext12225.databinding.ActivityFourBinding;import java.util.ArrayList;/** * 1.recycleView * 2.自定义binding de set方法 * (1)现在utils方法写一个@BindingAdapter({"bind:image"}) public static void imageLoader(ImageView imageView, int drawableId) { imageView.setBackgroundResource(drawableId); (2)然后在布局里面用上 <variable name="drawableId" type="int" /> <ImageView android:id="@+id/img" android:layout_width="wrap_content" android:layout_height="wrap_content" app:image="@{drawableId}"/> (3)实际用的地方 ((ViewHolder)holder).getBinding().setVariable(com.example.administrator.databindtext12225.BR.drawableId,R.mipmap.ic_launcher);// @BindingAdapter({"bind:imageUrl", "bind:error"})// public static void loadImage(ImageView view, String url, Drawable error) {// Picasso.with(view.getContext()).load(url).error(error).into(view);// } * */public class FourActivity extends AppCompatActivity { private ActivityFourBinding mBinging; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_four); mBinging = DataBindingUtil.setContentView(FourActivity.this, R.layout.activity_four); mBinging.recycle.setLayoutManager(new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false)); final ArrayList<Student> mData = new ArrayList<>(); for (int i = 0;i<10;i++){ Student stu = new Student(); stu.stuName.set("我是学生 "+i); mData.add(stu); } mBinging.recycle.setAdapter(new MyAdapter(mData)); mBinging.btChangeData.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { mData.get(4).stuName.set("hahahhahaha"); //普通写法是没用 //1 stu 中写bindable //2 把String 写成 observableField<String> } }); }}Acitivyt_four.xml
<?xml version="1.0" encoding="utf-8"?><layout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" tools:context="com.example.administrator.databindtext12225.FourActivity"> <data> </data> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" > <android.support.v7.widget.RecyclerView android:id="@+id/recycle" android:layout_width="match_parent" android:layout_height="wrap_content"> </android.support.v7.widget.RecyclerView> <Button android:id="@+id/bt_change_data" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="点我改变数据"/> </LinearLayout></layout>源码下载
新闻热点
疑难解答