読者です 読者をやめる 読者になる 読者になる

ほげほげ(仮)

仮死状態

RecyclerViewでDataBindingを使う

Android

RecyclerViewでDataBindingを使用する簡単なサンプルです。

Gradle

DataBindingの設定をしておきます。

android {
    // ...

    dataBinding {
        enabled = true
    }
}

データクラス

サンプル用に次のような簡単なデータクラスを用意します。

public class Item {

    public final String name;

    public Item(String name) {
        this.name = name;
    }
}

レイアウト

リスト1行のレイアウトです。

基本的には通常のDataBindingと同じです。TextViewに先ほど作ったデータクラスの値を表示します。

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

    <data>

        <variable
            name="item"
            type="com.example.Item" />
    </data>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@{item.name}"/>
    </LinearLayout>
</layout>

Adapter

Adapterのコードです。

onCreateViewHolderでBindingクラスを取得し、それをViewHolderに渡して保持するようにしてます。

表示はonBindViewHolderでBindingクラスに対して変数をセットします。その後、executePendingBindingsを呼び出して即座に反映するようにしています。

public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.ViewHolder> {

    private List<Item> items;

    public RecyclerAdapter(List<Item> items) {
        this.items = items;
    }

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        // DataBinding
        ListItemBinding binding = ListItemBinding.inflate(LayoutInflater.from(parent.getContext()), parent, false);
        return new ViewHolder(binding);
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        Item item = items.get(position);

        // データセット
        holder.binding.setItem(item);

        // Viewへの反映を即座に行う
        holder.binding.executePendingBindings();
    }

    @Override
    public int getItemCount() {
        return items.size();
    }

    static class ViewHolder extends RecyclerView.ViewHolder {

        final ListItemBinding binding;

        public ViewHolder(ListItemBinding binding) {
            super(binding.getRoot());
            this.binding = binding;
        }
    }
}

Activity or Fragment

ここまで実装したらあとはActivityなりFragmentなりで使用するだけです。

今回はActivityの例です。レイアウトファイルは省略で。

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ActivityMainBinding binding =  DataBindingUtil.setContentView(this, R.layout.activity_main);

        List<Item> items = new ArrayList<>();
        items.add(new Item("Item1"));
        items.add(new Item("Item2"));
        items.add(new Item("Item3"));
        items.add(new Item("Item4"));
        items.add(new Item("Item5"));

        RecyclerAdapter adapter = new RecyclerAdapter(items);
        binding.recycler.setLayoutManager(new LinearLayoutManager(this));
        binding.recycler.setAdapter(adapter);
    }
}

ドキュメント