官网文档:https://developer.android.google.cn/topic/libraries/data-binding/index.html
如何配置
android{
dataBinding{
enabled = true
}
}
准备
创建一个java bean 类
public classUserimplementsSerializable{
publicStringname;
public String phone;
publicUser(String name,String phone) {
this.name=name;
this.phone = phone;
}
}
创建一个类Presenter。封装了两个方法
public class Presenter{
private static finalStringTAG=Presenter.class.getSimpleName();
public void present(View view){
Log.d(TAG,"present: "+view.getTag());
}
public void setUser(View view,User user){
Log.d(TAG,"setUser: "+user.name);
}
布局文件
这一点与原来的布局文件有点差别,将布局根节点改为了layout,并且引入了节点data.
创建布局文件activity_main.xml
<layout xmlns:android="http://schemas.android.com/apk/res/android">
<data>
<variable
name = "user"//根据name生成对应的ViewDataBinding.setUser()方法和getUser()方法
type="com.example.User"/>//type指定某个具体的类,可以是自定义的类也可以是android自身的类
//通过import的方式引入某个类
<import type="com.example.Presenter/>
<variable name = "presenter type="Presenter"/>
<import type="android.view.View.OnClickListener/>//引入android的类
<variable name="onClick" type="OnClickListener"/>
<variable name="list” type="java.util.List<String>/>//注意这里List后泛型的尖括弧要
//使用转义符\\<和\\>
<variable name="listKey" type="Integer"/>
</data>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{user.name}"//显示用户的名字
/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@{list[listKey]}"//显示集合数据
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Presenter presente"
android:onClick="@{(view) -> presenter.present(view)}"//这里使用了lambda表达式.第一个(view)表示的是
//View.Onclick(view),参数只能是view ①
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Presenter setUser"
android:onClick="@{(view) -> presenter.setUser(view,user)}"//②
/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="OnClick"
android:onClick="@{onClick}"//这里直接使用前面定义的方法③
/>
</LinearLayout
</layout>>>
对于上面布局中三个Button的点击事件,这样处理(在Activity中处理为例)
//这个ActivityMainBinding的名字是根据对应的布局文件来生成的,即使在RecyclerView的
//item view中也是如此
ActivityMainBinding binding = DataBindingUtil.setContentView(activity,R.layout.activity_main);
binding.setUser(new User("张三“,"12530"));//对应的布局会自动显示
//③所在的Button点击事件,使用了lambda表达式
binding.setOnClick((view) ->
{
...
}
);
//对于①和②的点击事件处理
binding.setPresenter(new Presenter());
//设置集合数据
binding.setList(new ArrayList());
//设置显示集合中第几条数据
binding.setListKey(3);
RecyclerView如何绑定
布局如前面所示,这里只关注RecyclerView.Aadapter的item view 如何绑定 创建Adapter的item view布局为layout_item.xml
在Adapter的onBindViewHolder方法中生成对应的ViewDataBinding对象
@Override
public BindingHolder onBindViewHolder(ViewGroup parent, int position) {
LayoutItemBinding itemBinding = DataBindingUtil.inflate(inflater,
R.layout.item_home,null,false);
return new BindingHolder(itemBinding);
}
创建对应的BindingHolder继承自RecyclerView.ViewHolder
public class BindingHolder extends RecyclerView.ViewHolder{
LayoutItemBinding binding;
public BindingHolder(LayoutItemBinding binding) {
super(binding.getRoot());
this.binding=binding;
}
public void bindData(User user) {
binding.setUser(user);
}
}
在Adapter的onBindViewHolder方法中只需要调用BindingHolder的bindData方法就可以了,省去了findViewById的操作
@Override
public voidbindViewHolder(HomeHolderholder, intposition) {
holder.bindData(userList.get(position));
//为item view添加点击事件
holder.binding.getRoot().setOnClickListener(v->
Toast.makeText(context,"position----"+position,Toast.LENGTH_SHORT).show()
);
}
转载于:https://my.oschina.net/u/2490946/blog/918479