Data Binding

来源:互联网 发布:sql server unique 编辑:程序博客网 时间:2024/05/06 22:10

完全掌握Android Data Binding

DataBinding使用

1.在Moudle的build.gradle下添加

android{    ...    dataBinding{        enabled = true;    }    ...}

2.新建一个MainActivity,对应的xml文件:activity_main.xml

修改xml文件

在最外层布局添加

< layout>
….
< /layout>

修改后:

<?xml version="1.0" encoding="utf-8"?><layout    xmlns:android="http://schemas.android.com/apk/res/android"    >    <LinearLayout        android:id="@+id/activity_main"        android:layout_width="match_parent"        android:layout_height="match_parent"        android:orientation="vertical"        >        <TextView            android:layout_width="wrap_content"            android:layout_height="wrap_content"            />    </LinearLayout></layout>

3.新建一个Model类User

public class User {    private String name;    private String little_name;    private int age;    public User(String name, String little_name, int age) {        this.name = name;        this.little_name = little_name;        this.age = age;    }    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }    public String getLittle_name() {        return little_name;    }    public void setLittle_name(String little_name) {        this.little_name = little_name;    }    public int getAge() {        return age;    }    public void setAge(int age) {        this.age = age;    }}

4.在activity_main.xml布局中做如下修改

1.添加< data>< /data>

方式一:
type后面写的是:User的包名 + User类名

    <data>        <variable name="user" type="databinding.test.git.databindingdemo.Model.User"/>    </data>

方式二:
添加一个import,与java中import类似,但是后面要多一个User类名

    <data>        <import type="databinding.test.git.databindingdemo.Model.User"/>        <variable name="user" type="User"/>    </data>

2.修改布局文件,使用user

通过“@{user.name}”方式使用,此处要注意,如果是int类型会报错。

        <TextView            android:layout_width="wrap_content"            android:layout_height="wrap_content"             android:text="@{user.name}"            />

3.在MainActivity中添加绑定

ActivityMainBinding是根据activity_main.xml自动生成的。
通过binding.setUser()实现绑定。
setUser方法,是根据xml文件中< data>< /data>中定义的variable自动生成的。

    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        final ActivityMainBinding binding = DataBindingUtil.setContentView(this, R.layout.activity_main);        final User user = new User("lucy", 10, "jack");        binding.setUser(user);    }

一个简单的DataBinding使用就完成了。

DataBinding更多用法

绑定事件

< data><variable name="clickListener" type="android.view.View.OnClickListener"/>< data>
        <TextView            android:id="@+id/little_name"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:text="@{null ?? user.little_name}"            android:onClick="@{clickListener}"            />
        binding.setClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                if(v instanceof TextView){                    user.setName("lululu");                    user.setAge(998);//                    ((TextView) v).setText("name:" + user.getName() + " age:" + user.getAge());                }                binding.littleName.setText("name:" + user.getName() + " age:" + user.getAge());            }        });

xml文件中使用java静态方法

1.定义静态方法

public class MyStringUtils {    public static String capitalize(final String word){        return word.toUpperCase();    }}

2.xml文件中data添加varible
alias是别名,可以区分同名类或方法,也可以缩短调用名称。

    <data>        <import type="databinding.test.git.databindingdemo.Utils.MyStringUtils" alias="StringUtils"/>    </data>

3.xml使用方式:

        <TextView            android:id="@+id/name"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:text="@{StringUtils.capitalize(user.name) + user.age}"            />

使用三元表达式(a > b? a:b)

使用dimen

        <TextView            android:id="@+id/name"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:padding="@{user.canrun ? @dimen/activity_horizontal_margin : 5}"            />

使用 a??b

a??b等价于a != null ? a : b;

View定义id,通过dababinding获取相应view

比如:

        <TextView            android:id="@+id/little_name"            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:text="@{null ?? user.little_name}"            android:onClick="@{clickListener}"            />

可以通过:

binding.littleName.setText("name:" + user.getName() + " age:" + user.getAge());

Observable Binding 数据的动态修改与显示

方式一:类继承BaseObservable

1.继承BaseObservable
2.在getName()方法添加注解:@Bindable
3.setName(String name)方法中修改值,并调用:

notifyPropertyChanged(BR.name);

完整代码:

public class User extends BaseObservable{    private String name;    private String little_name;    private int age;    public User(String name, String little_name, int age) {        this.name = name;        this.little_name = little_name;        this.age = age;    }    @Bindable    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;        notifyPropertyChanged(BR.name);    }}

方式二:成员绑定

1.通过ObservableField< 引用类型>或 Observable< 基本类型>
比如:

    private final ObservableField<String> little_name = new ObservableField<>();    private final ObservableInt age = new ObservableInt();

2.get/set方法调整

    public int getAge() {        return age.get();    }    public void setAge(int age) {        this.age.set(age);    }    public String getLittle_name() {        return little_name.get();    }    public void setLittle_name(String little_name) {        this.little_name.set(little_name);    }

RecyclerView中的动态绑定

###0.新建一个item_databinding.xml文件
布局如下:

<?xml version="1.0" encoding="utf-8"?><layout    xmlns:android="http://schemas.android.com/apk/res/android"    >    <data>        <variable name="user" type="databinding.test.git.databindingdemo.Model.User"/>        <variable name="itemClick" type="android.view.View.OnClickListener"/>    </data>    <FrameLayout        android:layout_width="match_parent"        android:layout_height="30dp"        android:orientation="horizontal"        android:background="#00fff0"        android:onClick="@{itemClick}"        >        <TextView            android:layout_width="wrap_content"            android:layout_height="wrap_content"            android:text="@{user.name}"            android:layout_gravity="center"            />        <View            android:layout_width="match_parent"            android:layout_height="0.5dp"            android:background="#00ff00"            />    </FrameLayout></layout>

1.定义DataBindingAdapter

a.DabaBindingAdapter 继承RecyclerView.Adapter

public class DataBindingAdapter extends RecyclerView.Adapter<DataBindingAdapter.VhDataBinding> {    List<User> users;    public DataBindingAdapter(List<User> users) {        this.users = users;    }}

b.定义ViewHolder

    protected class VhDataBinding extends RecyclerView.ViewHolder{        private ViewDataBinding binding;        public VhDataBinding(View itemView) {            super(itemView);        }        public void setItemClick(final int pos){            binding.getRoot().setOnClickListener(new View.OnClickListener() {                @Override                public void onClick(View v) {                    users.get(pos).setName("修改了名字》》》》》" + pos);                }            });        }        public ViewDataBinding getBinding() {            return binding;        }        public void setBinding(ViewDataBinding binding) {            this.binding = binding;        }    }

c.重写onCreateViewHolder

    @Override    public VhDataBinding onCreateViewHolder(ViewGroup parent, int viewType) {        ViewDataBinding binding = DataBindingUtil.inflate(                LayoutInflater.from(parent.getContext()),                R.layout.item_databinding,                parent,                false);        VhDataBinding vh = new VhDataBinding(binding.getRoot());        vh.setBinding(binding);        return vh;    }

d.重写onBindViewHolder

    @Override    public void onBindViewHolder(VhDataBinding holder, int position) {        User user = users.get(position);        holder.getBinding().setVariable(BR.user, user);        holder.getBinding().executePendingBindings();        holder.setItemClick(position);    }

e.不要忘了getItemCount

    @Override    public int getItemCount() {        return users.size();    }

2.MainActivity中布局文件添加RecyclerView

3.MainActivity中onCreate方法添加如下代码:

        List<User> users = new ArrayList<>();        for (int i = 0; i < 100; i++) {            User us = new User("name->" + i,  i, "pos->" + i);            users.add(us);        }        DataBindingAdapter mAdapter = new DataBindingAdapter(users);        binding.recyclerview.setLayoutManager(new LinearLayoutManager(this));        binding.recyclerview.setAdapter(mAdapter);

运行后点击item,item的内容会随着点击动态改变。

0 0
原创粉丝点击