官網文檔: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