1.model的buildgradle加
android {
....
dataBinding {
enabled = true
}
}
2.创建你所需要的model
public class DataBindModel extends BaseObservable{
//继承BaseObservable使其参与编译时生成对应的字段
private String firstName;
private String lastName;
@Bindable
public String getFirstName() {
return this.firstName;
}
@Bindable
public String getLastName() {
return this.lastName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
//下行代码实现set时动态刷新ui, BR后面的字段需要编译后产生
notifyPropertyChanged(BR.firstName);
}
public void setLastName(String lastName) {
this.lastName = lastName;
notifyPropertyChanged(BR.lastName);
}
}
3.布局文件中改为 <layout> </layout>
编译器会自动生成对应的binding类
Binding和局文件名有关,以大写字母+(移除下划线的)字母 + “Binding”后缀
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable
//name是自己定义的可以随意修改
name="user"
//type的位置就是你model所在的位置
type="com.practice.mymvvmproject.DataBindModel"/>
</data>
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
//这是根据model自动编译生成的字段
android:text="@{user.firstName}"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
//这是根据model自动编译生成的字段
android:text="@{user.lastName}"/>
<Button
android:id="@+id/click"
android:text="dataBing"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout>
</layout>
3.在对应的Activity中绑定对应的model
public class DataBindActivity extends Activity {
private ActivityDatabindBinding activityDatabindBinding;
public int i = 0;
public DataBindModel dataBindModel;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
activityDatabindBinding = DataBindingUtil.setContentView(this, R.layout.activity_databind);
dataBindModel = new DataBindModel();
activityDatabindBinding.setUser(dataBindModel);
dataBindModel.setFirstName("这是第一种用法firstName");
dataBindModel.setLastName("这是第一种用法lastName");
//这里的click是xml定义的button的id
Button click = activityDatabindBinding.click;
click.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
dataBindModel.setFirstName("这是第一种用法firstName" + i++);
}
});
}
}
至此databind的基本数据绑定就完成了
下面是一些其他的用法
1.是不是感觉model写的东西很多,很麻烦?试试下面这种写法
public class DataBindModel2 extends BaseObservable{
public ObservableField<String> firstName = new ObservableField<>();
public ObservableField<String> lastName = new ObservableField<>();
}
通过继承BaseObservable 创建对应的ObservableField可以实现上面model的全部功能啦。
==并且支持多重数据格式如ObservableChar, ObservableShort, ObservableInt等等==
调用方式变为
DataBindModel2 dataBindModel2 = new DataBindModel2();
dataBindModel2.firstName.set("这是第二种用法firstName");
dataBindModel2.lastName.set("这是第二种用法lastName");
记得在xml中更改对应的model哦~
2.在listVIew Grideview等中的用法
这当然是必不可少的知识啦~
1.创建model,方便起见就用之前的model
2.定义RecyclerView的item布局
<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable
name="user"
type="com.practice.mymvvmproject.DataBindModel"/>
</data>
<LinearLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="40dp">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.firstName}"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.lastName}"/>
</LinearLayout>
</layout>
3.创建RecyclerView对应的adapter
public class DataBindAdapter extends RecyclerView.Adapter<DataBindAdapter.ViewHolder> {
private List<DataBindModel> listBeen;
private Context context;
public DataBindAdapter(List<DataBindModel> listBeen, Context context) {//构造函数要数据跟上下文
this.listBeen = listBeen;
this.context = context;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
ItemListBinding binding = DataBindingUtil.inflate(LayoutInflater.from(context), R.layout.item_list,
parent, false);
return new ViewHolder(binding.getRoot());
}
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
ItemListBinding binding = DataBindingUtil.getBinding(holder.itemView);
binding.setUser(listBeen.get(position));
binding.executePendingBindings();
}
@Override
public int getItemCount() {
return listBeen.size();
}
public static class ViewHolder extends RecyclerView.ViewHolder {
public ViewHolder(View itemView) {
super(itemView);
}
}
}
4.创建activity的布局
<?xml version="1.0" encoding="utf-8"?>
<layout>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<android.support.v7.widget.RecyclerView
android:id="@+id/recylerView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</LinearLayout>
</layout>
5.最后在activity中setAdapter即可
public class DataBindActivity extends Activity {
private ActivityRecycleBinding activityRecycleBinding;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
activityRecycleBinding = DataBindingUtil.setContentView(this, R.layout.activity_recycle);
ArrayList<DataBindModel> dataBindModels = new ArrayList<>();
for (int i = 0;i<30;i++){
DataBindModel dataBindModel = new DataBindModel();
dataBindModel.setFirstName("这是第"+i+"个条目");
dataBindModel.setLastName("这是第"+i+"个条目");
dataBindModels.add(dataBindModel);
}
DataBindAdapter dataBindAdapter = new DataBindAdapter(dataBindModels,this);
activityRecycleBinding.recylerView.setLayoutManager(new LinearLayoutManager(this));
activityRecycleBinding.recylerView.setAdapter(dataBindAdapter);
}
}
最终效果图如下:
网友评论