DiffUtilのgetChangePayloadで返したオブジェクトをどう使うか
DiffUtilのgetChangePayload
では、古いアイテムと新しいアイテムでどのフィールドが更新されたかの情報を詰めたオブジェクトを生成して返す。
どんな感じなのかは以下のサイトを参照。
- DiffUtil is a must! – ProAndroidDev
- Android DTT #12 — Optimize and Animate Your RecyclerView with DiffUtil
このreturnするPayloadがどこで使われるかちゃんとわかって無かったのだけど、onBindViewHolder(ViewHolder holder, int position, List<Object> payloads)
のpayloads
で参照できる。
RecyclerView.Adapter | Android Developers
areItemsTheSame(int, int)
がtrue
を返し、areContentsTheSame(int, int)
がfalse
を返すなら、新旧のitemエンティティ(一意に識別できるオブジェクト)自体は同じだが、そのオブジェクトの持つデータが異なる。
どのデータが新しいデータで更新されたかをgetChangePayload
でオブジェクトにして返してやり、onBindViewHolder(ViewHolder holder, int position, List<Object> payloads)
でpayloadsから更新内容を取得してViewを部分的に更新してやればゼロからViewを構築するよりコストが下がる。
この時アニメーションを掛けて更新すると良い感じになる。なるほど。