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