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
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
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
140
CameraX使ってみた
takuji31
0
280
kotlinx.datetime 使ってみた
takuji31
0
990
HiltのCustom Componentについて
takuji31
0
350
java.timeをAndroidで使う
takuji31
0
180
KSPを使ってコード生成
takuji31
0
430
Kotlin Symbol Processing API (KSP) を使って Kotlin ア プリケーションの開発を効率化する
takuji31
1
3.1k
kotlinx.serialization
takuji31
0
670
kanmoba-returns-02.pdf
takuji31
0
270
Other Decks in Technology
See All in Technology
2026-02-25 Tokyo dbt meetup プロダクトと融合したCI/CD で実現する、堅牢なデータパイプラインの作り方
y_ken
0
160
Databricks (と気合い)で頑張るAI Agent 運用
kameitomohiro
0
350
作るべきものと向き合う - ecspresso 8年間の開発史から学ぶ技術選定 / 技術選定con findy 2026
fujiwara3
6
1.7k
20260222ねこIoTLT ねこIoTLTをふりかえる
poropinai1966
0
320
Secure Boot 2026 - Aggiornamento dei certificati UEFI e piano di adozione in azienda
memiug
0
130
Claude Codeと駆け抜ける 情報収集と実践録
sontixyou
2
1.3k
[続・営業向け 誰でも話せるOCI セールストーク] AWSよりOCIの優位性が分からない編(2026年2月20日開催)
oracle4engineer
PRO
0
150
研究開発部メンバーの働き⽅ / Sansan R&D Profile
sansan33
PRO
4
22k
AIエージェントで変わる開発プロセス ― レビューボトルネックからの脱却
lycorptech_jp
PRO
2
830
どこで打鍵するのが良い? IaCの実行基盤選定について
nrinetcom
PRO
2
110
primeNumber DATA MANAGEMENT CAMP #2:
masatoshi0205
1
650
社内でAWS BuilderCards体験会を立ち上げ、得られた気づき / 20260225 Masaki Okuda
shift_evolve
PRO
1
150
Featured
See All Featured
<Decoding/> the Language of Devs - We Love SEO 2024
nikkihalliwell
1
150
Docker and Python
trallard
47
3.7k
Digital Projects Gone Horribly Wrong (And the UX Pros Who Still Save the Day) - Dean Schuster
uxyall
0
570
How to Grow Your eCommerce with AI & Automation
katarinadahlin
PRO
1
130
エンジニアに許された特別な時間の終わり
watany
106
240k
The agentic SEO stack - context over prompts
schlessera
0
680
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
190
Designing Powerful Visuals for Engaging Learning
tmiket
0
250
How to Think Like a Performance Engineer
csswizardry
28
2.5k
Unlocking the hidden potential of vector embeddings in international SEO
frankvandijk
0
190
Building a A Zero-Code AI SEO Workflow
portentint
PRO
0
360
More Than Pixels: Becoming A User Experience Designer
marktimemedia
3
340
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 !