天天看点

android DataBinding

官网文档: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&lt;String&gt;/>//注意这里List后泛型的尖括弧要

//使用转义符\\&lt;和\\&gt;

<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