天天看點

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