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