Androidエンジニア+セキュリティ全般を兼務する鈴木です。 Google I/O 最終日のレポートをしようと思います。ちなみに本日は 更に涼しく、むしろ寒く感じた一日でした。今日は参加したセッションのうちの「RecyclerViw ins and outs」について報告したいと思います。
本セッションは非常に内容が濃く、RecyclerViewの前身であるListViewの説明、RecyclerViewの開発の経緯などのジャブから、詳細までカバーしておりました。すべての内容の詳細を記述するのはめんどくさい手間なので、本ブログでは内容のまとめまでに留めておきます。各内容に飛べるようリンクも貼っておきましたので是非ご活用ください。
Chap1: ListViewの誕生と課題、そしてRecyclerViewへ
- 動画の0:00~
- ListViewの歴史についての話
- 当時の制限下において、当時の課題をどう解決していったか。
- RecyclerViewを作るにあたった動機がここで紹介される形。
Chap2: RecyclerView概要
- 動画の12:16~
- RecyclerViewとそのコンポーネントの概要について紹介
- LayoutManager: アイテムのRecyclerView内におけるポジション
- ItemAnimator: アイテムのアニメーション
- Adapter: アイテムの提供
Chap3: Adapter
- 動画の14:25~
- ここは概要だけなので見なくていいかも
Chap4: ViewHolder
- 動画の17:18~
- ViewHolderのライフサイクルと各ライフサイクルにおけるフロー
Chap5: ItemAnimator
- 動画の26:45~
- Predictive Animationについての紹介
- ここも概要だけなので見なくていい。Chap6へのイントロだけのためにある。
Chap6: ChildHelper
- 動画の30:37~
- LayoutMangerに仮想的なListを返すクラス
- 例えばSwipeによってアイテムが除去されるアニメーションが開始されると、ChildHelperはSwipeされた後の仮想的ListをLayoutManagerに返す
Chap7: AdapterHelper
- 動画の32:47~
- Adapterに対するnotify(add, remove, insert, move)操作を記録するクラス
- こいつのおかげで再描画終了前にアイテムを操作しても、正しいアイテムを操作できる
Chap8: ItemDecoration
- 動画の36:04~
- 下記メソッドの紹介
- getItemOffsets(), onDraw(), onDrawOver():
- ItemDecorationでadapterへのアクセスはしない
- ViewHolderに必要な情報は保存するべし
Chap9: RecycledViewPool
- 動画の39:04~
- 同一Context内でRecycledViewを共有する
Chap10: ItemTuchHelper
- 動画の40:43~
- ItemTouchHelper及びそのメソッドの紹介
Chap11: Tips
- 動画の42:33~
- アイテムは更新されないかぎりonBindは呼ばれない
- onBindViewHolder時のpositionは最終的な位置ではない
- 以下の書き方はNG
public void onBindViewHolder(final ViewHolder holder, final int position) { holder.itemView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { removeAtPosition(holder.getAdapterPositioN()); //removeAtPosition(position); // NG! } }); }
- Payloads: ViewHolderのいち部分を更新したい時に指定するのに有効。下記のメソッドで使用可能な引数)
- onBindViewHolder
- notifyItemChanged
- notifyItemRangeChanged
- OnCreateViewHolderで既存のViewHolderの使い回しはしない!
- Adapter positionとLayoutポジションの使い分け
- Layout positionはonLayoutが呼ばれるまで変更されないので注意
以上です。幾つか自分が以前はまったポイントもあり、非常にためになるセッションでした。是非のちほどyoutubeでみてください。