準備
- build.gradleを編集する。
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 セット処理
}
}
公式ガイド
以上。