Android Data Binding代码实践(告别findViewById)

Data Binding实战(一)

Data Binding语法解析(二)

Data Binding高级用法(三)

好了,继前三篇学习了Data Binding之后,我们可以发现它的强大之处有这么几点:

1、使用MVVM模式,让整个项目结构清晰明了

2、通过ViewModel连接View和Model,使得View与Model层解耦,分层后各司其职,维护方便

3、易于项目的测试

4、可以根据id自动生成View的对象,再也不用findViewById了

好了,说了好处,当然也有不太好的地方,毕竟是今年刚刚推出来的,我总结出了两大缺点,我想以后的版本肯定会改进的:

1、Data Binding进行数据绑定时,不能通过代码提示写后续代码,全部都是需要一个一个手写,而且语法检查只在编译时检查,这个过程比较繁琐

2、Data Binding目前只有单向绑定,并不能双向的绑定,后续版本加上了双向绑定我想谁能拒绝用它呢

下面通过一个Demo来看Data Binding在RecyclerView中的使用:

Model层

就只有一个User类,它继承自BaseObservable,并在getter方法中加入@Bindable注解,在setter方法中加入notifyPropertyChanged(),这样User中的数据更新时可以通知UI更新:

public class User extends BaseObservable{
    private String userName;
    private String userPassword;
    private int userAge;
    @Bindable
    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
        notifyPropertyChanged(com.sunzxyong.binding.BR.userName);
    }
    @Bindable
    public String getUserPassword() {
        return userPassword;
    }

    public void setUserPassword(String userPassword) {
        this.userPassword = userPassword;
        notifyPropertyChanged(com.sunzxyong.binding.BR.userPassword);
    }
    @Bindable
    public int getUserAge() {
        return userAge;
    }

    public void setUserAge(int userAge) {
        this.userAge = userAge;
        notifyPropertyChanged(com.sunzxyong.binding.BR.userAge);
    }

    public User(String userName, String userPassword, int userAge) {
        this.userName = userName;
        this.userPassword = userPassword;
        this.userAge = userAge;
    }
}

View层

主界面:

<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools">

    <data>

    </data>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical"
        tools:context=".MainActivity">

        <android.support.v7.widget.Toolbar
            android:id="@+id/toolbar"
            android:layout_width="match_parent"
            android:layout_height="?attr/actionBarSize"
            android:background="#03A9F4" />

        <android.support.v7.widget.RecyclerView
            android:id="@+id/recycler_view"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
    </LinearLayout>
</layout>

recycler_item:

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">

    <data>
        <variable
            name="user"
            type="com.sunzxyong.binding.model.User"/>
    </data>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:layout_margin="5dp"
        android:background="#009688"
        android:gravity="center"
        android:orientation="vertical">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{user.userName}"
            android:textSize="20sp"
            android:textColor="#ffffff" />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{user.userPassword}"
            android:textSize="20sp"
            android:textColor="#ffffff" />
        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="@{String.valueOf(user.userAge)}"
            android:textSize="20sp"
            android:textColor="#ffffff" />
    </LinearLayout>
</layout>

recycler_item中绑定了User。。。

ViewModel层:

设置Toolbar和RecyclerView:

我们通过得到ActivityMainBinding对象得到Toolbar控件和RecyclerView控件:

//设置Toolbar
        ActivityMainBinding mainBinding = DataBindingUtil.setContentView(this, R.layout.activity_main);
        mainBinding.toolbar.setTitle("Android Data Binding代码实战");
        mainBinding.toolbar.setTitleTextColor(Color.WHITE);
        setSupportActionBar(mainBinding.toolbar);

        initData();

        //设置RecyclerView
        mainBinding.recyclerView.setLayoutManager(new StaggeredGridLayoutManager(2, StaggeredGridLayoutManager.VERTICAL));
        MyRecyclerViewAdapter adapter = new MyRecyclerViewAdapter(this,users);
        mainBinding.recyclerView.setAdapter(adapter);

BindingHolder:

public class BindingHolder extends RecyclerView.ViewHolder {
    private RecyclerItemBinding binding;

    public BindingHolder(View itemView) {
        super(itemView);
    }

    public RecyclerItemBinding getBinding() {
        return binding;
    }

    public void setBinding(RecyclerItemBinding binding) {
        this.binding = binding;
    }
}

MyRecyclerViewAdapter:

public class MyRecyclerViewAdapter extends RecyclerView.Adapter<BindingHolder> {
    private Context mContext;
    private List<User> users;
    private List<Integer> heights;
    public MyRecyclerViewAdapter(Context context,List<User> users) {
        this.mContext = context;
        this.users = users;
        initHeight();
    }
    private void initHeight(){
        heights = new ArrayList<>();
        for (int i = 0; i < users.size(); i++) {
            heights.add(200+(int)(300*Math.random()));
        }
    }
    @Override
    public BindingHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        RecyclerItemBinding mItemBinding = DataBindingUtil.inflate(LayoutInflater.from(mContext), R.layout.recycler_item, parent, false);
        BindingHolder mHolder = new BindingHolder(mItemBinding.getRoot());//得到根布局View设置给ViewHolder
        mHolder.setBinding(mItemBinding);//把mItemBinding设置给ViewHolder
        return mHolder;
    }

    @Override
    public void onBindViewHolder(BindingHolder holder, int position) {
        ViewGroup.LayoutParams params = holder.itemView.getLayoutParams();
        params.height = heights.get(position);
        holder.itemView.setLayoutParams(params);

        //通过holder.getBinding()得到Binding Class
        User user = users.get(position);
        holder.getBinding().setVariable(com.sunzxyong.binding.BR.user,user);//动态设置数据
//        holder.getBinding().setUser(user);这种方式也行,因为User继承自BaseObservable
        holder.getBinding().executePendingBindings();//立即更新UI
    }

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

效果:

源码地址

好了,Android Data Binding目前全部功能就讲完了

Google官方文档:https://developer.android.com/intl/zh-cn/tools/data-binding/guide.html

版权声明:本文为博主原创文章,未经博主允许不得转载。转载注明出处:http://blog.csdn.net/u010687392

时间: 2024-10-09 11:15:47

Android Data Binding代码实践(告别findViewById)的相关文章

Android Data Binding

1 引入 如何高效地实现以下界面? 有好几年findViewById实战经验的我,感觉并不难啊.一般会 * 1.先定义一个User的Model类,数据来自JSON解析: * 2.创建一个xml,随后在xml中布局完所有View,对头像.标题.积分.登录按钮一个id: * 3.在Activity中通过findViewById获取到头像ImageView.标题TextView.积分TextView.登录Button,然后给Button设置监听器,再根据登陆状态展示对应数据: 实现如下: * User

Android Data Binding实战(一)

在今年Google I/O大会上,Google推出Design Library库的同时也推出了Android Data Binding,那么什么是Data Binding?其名曰数据绑定,使用它我们可以轻松实现MVVM(模型-视图-视图模型)模式,来实现应用之间数据与视图的分离.视图与业务逻辑的分离.数据与业务逻辑的分离,从而达到低耦合.可重用性.易测试性等好处,那么我们首先先来看看什么是MVVM模式. 我自己画了一张图来帮助理解,就不多描述了,毕竟重点是Data Binding的使用 通过上图

Android Data Binding 系列(二) -- Binding与Observer实现

写在前面 上篇文章 Android Data Binding 系列(一) – 详细介绍与使用 介绍了 Data Binding 的基础及其用法,本文接上篇,结合DataBindingDemo 来学习下 Data Binding 的实现. 绑定实现 Activity在inflate layout时,通过DataBindingUtil来生成绑定,从代码看,是遍历contentView得到View数组对象,然后通过数据绑定library生成对应的Binding类,含Views.变量.listeners

Android Data Binding 技术

Android Data Binding 技术

Android Data Binding Library 官方文档(译)

地址:https://developer.android.google.cn/topic/libraries/data-binding/index.html 本文地址:http://blog.csdn.net/jjwwmlp456/article/details/54915981 Data Binding Library (数据绑定库),旨在减少绑定应用程序逻辑和布局所需的一些耦合性代码 最低支持Android 2.1 (API Level 7) 构建环境 使用gradle插件1.5-alpha

完全掌握Android Data Binding

转载:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0603/2992.html 来源 https://github.com/LyndonChin/MasteringAndroidDataBinding 编辑推荐:稀土掘金,这是一个针对技术开发者的一个应用,你可以在掘金上获取最新最优质的技术干货,不仅仅是Android知识.前端.后端以至于产品和设计都有涉猎,想成为全栈工程师的朋友不要错过! 本教程是跟着 Data Bind

Android Data Binding高级用法-Observable、动态生成Binding Class

设置View的id 虽然说Data Binding这种分层模式使得我们对数据的传递简单明了,一般情况下我们可以不设置View的id,不使用findViewById即可对View进行数据上一系列的操作,不过有时候根据情况我们需要对某些View设置id,但是还是可以不findViewById即可得到该控件的对象,因为设置id后ViewDataBinding类会自动生成对应的控件对象,如: <layout xmlns:android="http://schemas.android.com/apk

android -------- Data Binding的使用(一)

Google推出自己官方的数据绑定框架Data Binding Library 已经很久了,很多企业也在使用 面试的时候也有问到,所以也去学习了一番,特来分享一下,希望对各位有所帮助 描述: Data Binding 是把数据直接绑定到 XML 文件上,并能实现自动刷新. Data Binding 减少了代码的耦合性,一些如 findViewById.setText 之类的操作都可以通过绑定实现. Data Binding 是MVVM模式开发的 Google 官方文档:https://devel

Android Data Binding语法解析(二)

上篇我们知道了Data Binding的最简单的用法,那么Data Binding其中最为重要也是最复杂的其实就是在xml布局文件中给对应的控件进行数据绑定了,接下来就一一说明Data Binding的使用各个场景的语法. 我们以User类这个Model为例: public class User { private String userName; private String userPassword; private boolean isExist; public String getUse