LoginSignup
80
68

More than 5 years have passed since last update.

RecyclerViewのDataBinding

Last updated at Posted at 2016-02-06

準備

  • 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 セット処理
    }
}

公式ガイド

Data Binding Guide

以上。

80
68
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
80
68