【Android】RecyclerViewの基本的な使い方
ListViewやGridViewよりも柔軟に対応できるためRecyclerViewが便利です。 DataBindingを使用でき、ItemTouchHelperを使うことでDragやSwipe処理を簡単に追加できます。 さらにLinearSnapHelperでItem単位のスナップも簡単です。
実装の流れ
- layoutにRecyclerViewを追加
- RecyclerViewのItemを追加
- RecyclerViewのAdapterを追加
- 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