Android Data Binding代碼實踐(告別findViewById)(四),androiddatabinding

來源:互聯網
上載者:User

Android Data Binding代碼實踐(告別findViewById)(四),androiddatabinding

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.