RecyclerViewのDataBinding

## 準備
- build.gradleを編集する。

```groovy:build.gradle
android {
    dataBinding {
        enabled = true
    }
}
```

## Observableクラスの作成
- BaseObservableを継承したBind対象にするクラスを作成する。これがレイアウトファイルに紐づく。

```User.java
public class User extends BaseObservable {
    // 名前
    private String firstName;
    // 名字
    private String lastName;
    // アイコン(どこかのurlから取得できることとする)
    private String iconUrl;

    // ゲッターに@Bindableをつける。変数につけてゲッター書かなくてもよい？
    @Bindable
    public String getFirstName() {
        return this.firstName;
    }

    @Bindable
    public String getLastName() {
        return this.lastName;
    }

    @Bindable
    public String getIconUrl() {
        return this.iconUrl;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
        // 変更されたことを通知
        notifyPropertyChanged(BR.firstName);
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
        notifyPropertyChanged(BR.lastName);
    }

    public void setIconUrl(String iconUrl) {
        this.iconUrl = iconUrl;
        notifyPropertyChanged(BR.iconUrl);
    }
}
```

## レイアウトファイル(.xml)の作成
###### RecyclerViewのアイテムのレイアウトファイルを編集する
- 全体(もともとのレイアウト)をlayoutタグで囲む

``` recycler_item.xml
<?xml version="1.0" encoding="utf-8"?>
<layout
    xmlns:android="http://schemas.android.com/apk/res/android">
		・
		・
</layout>
```

- dataタグにBind情報を書く

``` recycler_item.xml
<?xml version="1.0" encoding="utf-8"?>
<layout
    xmlns:android="http://schemas.android.com/apk/res/android">

    <data>
        <variable>
        	<!-- キーになる名前 -->
        	name="user"
        	<!-- 作成したObserabaleクラス -->
        	type="com.example.User"
        </variable>
    </data>
		・
		・
</layout>
```

- 例

``` recycler_item.xml
<?xml version="1.0" encoding="utf-8"?>
<layout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/tools">
    <!-- ↑この例ではapp:imageUrlを使うため -->

    <data>
        <variable>
        	<!-- キーになる名前 -->
        	name="user"
        	<!-- 作成したObserabaleクラス -->
        	type="com.example.User"
        </variable>
    </data>


    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

		<!-- 名前 -->
        <TextView>
            android:id="@+id/first"
            	・
            	・
            android:text="@{user.firstName}”>
        </TextView>
            
        <!-- 名字 -->
        <TextView>
            android:id="@+id/last"
            	・
            	・
            android:text="@{user.lastName}”>
        </TextView>
        
        <!-- アイコン -->
        <ImageView>
            android:id="@+id/icon"
         		・
         		・
            app:imageUrl="@{user.iconUrl}">
        </ImageView>
    </RelativeLayout>
</layout>
```

## Adapterクラスの作成
###### RecyclerView.Adapterを継承したクラスを作成する。
- DataBinding適用前はこんな感じかと思います。

``` RecyclerViewAdapter.java
public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ItemViewHolder> {
    private ArrayList<User> mUserList;

	// ViewHolder
    public static class ItemViewHolder extends RecyclerView.ViewHolder {
        private TextView mFirst;
        private TextView mLast;
        private ImageView mIcon;

        public ItemViewHolder(View v) {
            super(v);
            mFirst = (TextView)v.findViewById(R.id.first);
            mLast = (TextView)v.findViewById(R.id.last);
            mIcon = (ImageView) v.findViewById(R.id.icon);
        }
        
        public TextView getFirst() {
        	return mFirst;
       	}
       	
       	public TextView getLast() {
        	return mLast;
       	}
       	
       	public ImageView getIcon() {
        	return mIcon;
       	}
    }

    /**
     * コンストラクタ
     */
    public RecyclerViewAdapter(ArrayList<User> userList) {
        mUserList = userList;
    }

    @Override
    public ItemViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    	// recycler_itemレイアウト
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.recycler_item, parent, false);
        return new ItemViewHolder(v);
    }

    @Override
    public void onBindViewHolder(ItemViewHolder holder, int position) {
        User user = mUserList.get(position);
        
        // Userデータをセット
        holder.getFirst().setText(user.getFirstName());
		holder.getLast().setText(user.getLastName());
		
		// 画像ロード処理
		Bitmap bmp = loadImage(user.getIconUrl());
		holder.getIcon().setImageBitmap(bmp);
    }
}
```

- DataBindingを適用するとこんな感じ

``` RecyclerViewAdapter.java
public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.ItemViewHolder> {
    private ArrayList<User> mUserList;

	// ViewHolder
    public static class ItemViewHolder extends RecyclerView.ViewHolder {
        private ViewDataBinding mBinding;

        public ItemViewHolder(View v) {
            super(v);
            // Bind処理
            mBinding = DataBindingUtil.bind(v);
        }
        
        public ViewDataBinding getBinding() {
        	return mBinding;
       	}
    }

    /**
     * コンストラクタ
     */
    public RecyclerViewAdapter(ArrayList<User> userList) {
        mUserList = userList;
    }

    @Override
    public ItemViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    	// recycler_itemレイアウト
        View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.recycler_item, parent, false);
        return new ItemViewHolder(v);
    }

    @Override
    public void onBindViewHolder(ItemViewHolder holder, int position) {
        User user = mUserList.get(position);
        
        // Userデータをセット。BR.userはxmlのvariableの名前
        holder.getBinding().setVariable(BR.user, user);
        holder.getBinding().executePendingBindings();
    }

    // user.iconUrlがurlに渡されてくる
    @BindingAdapter({"bind:imageUrl"})
    public static void loadImage(final ImageView view, final String url) {
        // 画像ロード and セット処理
    }
}
```

## 公式ガイド
[Data Binding Guide](http://developer.android.com/intl/ja/tools/data-binding/guide.html)

以上。