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

【Android】RecyclerViewの基本的な使い方

ListViewやGridViewよりも柔軟に対応できるためRecyclerViewが便利です。 DataBindingを使用でき、ItemTouchHelperを使うことでDragやSwipe処理を簡単に追加できます。 さらにLinearSnapHelperでItem単位のスナップも簡単です。

実装の流れ

  1. layoutにRecyclerViewを追加
  2. RecyclerViewのItemを追加
  3. RecyclerViewのAdapterを追加
  4. RecyclerViewにadapterをセット

実装

1. layoutにRecyclerViewを追加

<android.support.v7.widget.RecyclerView
    android:id="@+id/recycler_view"
    app:layoutManager="android.support.v7.widget.LinearLayoutManager"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

コードの記述無しにXMLのみでListのレイアウトを設定できます。

  • app:layoutManager=“android.support.v7.widget.GridLayoutManager"でGrid
  • app:spanCount=“2"で2xNのGrid
  • android:orientation=“horizontal"で水平方向

2. RecyclerViewのItemを追加

<LinearLayout>
    <TextView android:id="@+id/text_view" />
</LinearLayout>

ListViewにあるようなタッチ反応のエフェクトは以下で有効にできます。 (例の場合、LineLayoutのbackgroundまたはforeground)

android:foreground="?attr/selectableItemBackground"

3. RecyclerViewのAdapterを追加

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

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        if(null == _inflater){
            _inflater = LayoutInflater.from(parent.getContext());
        }

        return new ViewHolder(_inflater.inflate(
            R.layout.hello_list, parent, false
        ));
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        //HelloData data;
        ...

        holder.textView.setText(data.text);
        holder.itemView.setOnClickListener(listener);
    }

    public class ViewHolder extends RecyclerView.ViewHolder{
        public TextView textView;

        public ViewHolder(View view){
            super(view);
            textView = (TextView)view.findViewById(R.id.text_view);
        }
    }
}

以前はListViewにListenerを設定していましたが、今後はAdapterにListenerを設定することになります。

4. RecyclerViewにadapterをセット

RecyclerView recyclerView = (RecyclerView)root.findViewById(R.id.recycler_view);
recyclerView.setAdapter(adapter);

DataBindingあり

DataBindingありの場合、2, 3の部分を変更します。

2. RecyclerViewのItemを追加
3. RecyclerView用のAdapterを追加

2. RecyclerViewのItemを追加

RecyclerViewのItemは通常のDataBindingと同様に記述します。

<layout>
    <data>
        <variable name="data" type="com.example.HelloData" />
    </data>

    <LinearLayout>
        <TextView android:text="@{data.text}" />
    </LinearLayout>
</layout>

3. RecyclerViewのAdapterを追加

DataBindingを使用すると、データが増えてもAdapterを変更せずにlayoutに追加するだけで済みます。

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

    //onCreateViewHolderは同様

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        //HelloData data;
        ...

        holder.binding.setVariable(BR.data, data);
        holder.binding.executePendingBindings(); //即時にバインディング
        holder.itemView.setOnClickListener(listener);
    }

    public class ViewHolder extends RecyclerView.ViewHolder{
        public ViewDataBinding binding;

        public ViewHolder(View view){
            super(view);
            binding = DataBindingUtil.bind(view);
        }
    }
}

スナップさせたい場合

GooglePlayストアにあるような、スクロールに加えItem単位でスナップさせたい場合、 LinearSnapHelperを使うと簡単に設定できます。

SnapHelper snapHelper = new LinearSnapHelper();
snapHelper.attachToRecyclerView(binding.recyclerView);

TODO

  • ItemTouchHelper

参考