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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值