Money Forward Developers Blog

株式会社マネーフォワード公式開発者向けブログです。技術や開発手法、イベント登壇などを発信します。サービスに関するご質問は、各サービス窓口までご連絡ください。

20230215130734

【レポート速報】Google I/O 2016 – Day3 「RecyclerViw ins and outs」

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

Chap4: ViewHolder

  • 動画の17:18~
  • ViewHolderのライフサイクルと各ライフサイクルにおけるフロー
    • ViewHolderの生成: 17:35
    • ViewHolderのリサイクル時(remove & reserve):18:35
    • ViewHolderのリサイクル時その2:20:39
    • ViewHolderの破棄:21:46
    • ViewHolderの破棄その2: 21:44

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

Chap10: ItemTuchHelper

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でみてください。