Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
DiffUtil
Search
Takuji Nishibayashi
August 31, 2016
Technology
0
190
DiffUtil
About DiffUtil in Kanmoba #17
Takuji Nishibayashi
August 31, 2016
Tweet
Share
More Decks by Takuji Nishibayashi
See All by Takuji Nishibayashi
compose-hot-reload を試そうとした話
takuji31
0
71
CameraX使ってみた
takuji31
0
210
kotlinx.datetime 使ってみた
takuji31
0
650
HiltのCustom Componentについて
takuji31
0
270
java.timeをAndroidで使う
takuji31
0
130
KSPを使ってコード生成
takuji31
0
370
Kotlin Symbol Processing API (KSP) を使って Kotlin ア プリケーションの開発を効率化する
takuji31
1
2.7k
kotlinx.serialization
takuji31
0
610
kanmoba-returns-02.pdf
takuji31
0
220
Other Decks in Technology
See All in Technology
Introduction to Sansan, inc / Sansan Global Development Center, Inc.
sansan33
PRO
0
2.6k
OpenTelemetry Collector internals
ymotongpoo
5
550
QAはソフトウェアエンジニアリングを学んで実践するのが大事なの
ymty
1
400
AIにどこまで任せる?実務で使える(かもしれない)AIエージェント設計の考え方
har1101
3
1.1k
DB 醬,嗨!哪泥嘎斯基?
line_developers_tw
PRO
0
220
Autonomous Database サービス・アップデート (FY25)
oracle4engineer
PRO
2
770
Grafana MCP serverでなんかし隊 / Try Grafana MCP server
kohbis
0
360
從四件事帶你見識見識 事件驅動架構設計 (EDA)
line_developers_tw
PRO
0
110
Whats_new_in_Podman_and_CRI-O_2025-06
orimanabu
3
180
エンジニア採用から始まる技術広報と組織づくり/202506lt
nishiuma
8
1.7k
評価の納得感を2段階高める「構造化フィードバック」
aloerina
1
200
Bill One 開発エンジニア 紹介資料
sansan33
PRO
4
12k
Featured
See All Featured
The Art of Programming - Codeland 2020
erikaheidi
54
13k
How to Think Like a Performance Engineer
csswizardry
24
1.7k
Writing Fast Ruby
sferik
628
61k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
32
2.3k
YesSQL, Process and Tooling at Scale
rocio
172
14k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
43
2.4k
Rebuilding a faster, lazier Slack
samanthasiow
81
9k
The Success of Rails: Ensuring Growth for the Next 100 Years
eileencodes
45
7.3k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
252
21k
Making Projects Easy
brettharned
116
6.2k
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.3k
Fireside Chat
paigeccino
37
3.5k
Transcript
DiffUtil @takuji31
@takuji31 (Takuji Nishibayashi) Application Engineer at Hatena
Loves ! (AVG 160 ~ 170)
Loves Kotlin
Kansai.kt #2 Γ·͢
11݄ͷͲ͔͜ͷ༵ (༧ఆ)
࠷ۙPerlͱ TypeScriptॻ͍ͯ·͢
AGENDA • DiffUtilͱ • ͬͯΈΔ • ੍ݶࣄ߲
DiffUtilͱ
2ͭͷListͷࠩΛܭࢉ͢ ΔϢʔςΟϦςΟʔɻ
recyclerview-v7 24.2.0 ~
ܭࢉͰ͖Δมߋ • Ճ • আ • ߋ৽ • Ҡಈ •
Φϓγϣϯࢦఆ • ܭࢉίετ͕Ͷ্͕Δ
2ͭͷΫϥε • DiffUtil.Callback • DiffUtil.DiffResult
DiffUtil.Callback
มԽΛDiffUtilʹ͑Δ Callback
DiffUtil.Callback • getNewListSize() • getOldListSize() • areItemsTheSame(int, int) • areContentsTheSame(int,
int) • getChangePayload(int, int)
DiffUtil.DiffResult
ܭࢉͨ͠diffͷ݁Ռ
DiffResult.dispatchUp datesTo(RecyclerView .Adapter| ListUpdateCallback)
ͬͯΈΔ
※͍ͭ௨ΓKotlinͰ͢
build.gradle dependencies { compile 'com.android.support:recyclerview-v7:24.2.0' }
Model enum class Status { INTERESTED, LIKE, LOVE; } data
class Artist(val name: String, val status: Status) { companion object { val list: List<Artist> = listOf( Artist(name = "খ།", status = LOVE), Artist(name = "Ӎٶఱ", status = LOVE), //... ) } }
DiffUtil.Callback class DiffCallback( val oldList: List<Artist>, val newList: List<Artist>) :
DiffUtil.Callback() { override fun areItemsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean { return oldList[oldItemPosition].name == newList[newItemPosition].name } override fun getOldListSize(): Int { return oldList.size } override fun getNewListSize(): Int { return newList.size } override fun areContentsTheSame(oldItemPosition: Int, newItemPosition: Int): Boolean { return oldList[oldItemPosition] == newList[newItemPosition] } override fun getChangePayload( oldItemPosition: Int, newItemPosition: Int): Pair<Status, Status> { return Pair(oldList[oldItemPosition].status, newList[newItemPosition].status) } }
diffΛܭࢉ͢Δ fun updateItems(items : List<Artist>) { val oldItems = adapter.items
val diffResult = DiffUtil.calculateDiff( DiffCallback( oldList = oldItems, newList = items ), true ) adapter.items = items diffResult.dispatchUpdatesTo(adapter) }
None
RecylerViewҎ֎ͱ Έ߹Θ͍ͤͨ
Change payloadͷத ΛݟͯԿ͔͍ͨ͠ɺͳͲ ͱ͍ͬͨ߹
ListUpdateCallbackΛ ͏
੍ݶࣄ߲ • ৽͍͠Listͱݹ͍ListΛൺֱ͢Δ • × MutableͳList • RealmCollection • ×
ཁૉͦͷͷ͕ߋ৽͞ΕΔ • RealmObject • Listͷཁૉ2^26(=67108864)·Ͱ
·ͱΊ • DiffUtil Λ͏͜ͱͰ RecylerView ͷৄࡉͳߋ৽௨͕ ָʹͳΔ • RecylerView Ҏ֎ͱͷΈ߹ΘͤͳͲڽͬͨ͜ͱΛΓ͍ͨ
࣌ ListUpdateCallback Λ͏
takuji31/ DiffUtilSample
enjoy diff life !