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
recyclerview-selection
Search
Shinnosuke Kugimiya
April 19, 2018
Programming
2.5k
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
recyclerview-selection
at potatotips #50
Shinnosuke Kugimiya
April 19, 2018
More Decks by Shinnosuke Kugimiya
See All by Shinnosuke Kugimiya
Claude Code x Androidアプリ 開発
kgmyshin
1
2.6k
AndroidアプリエンジニアもMCPを触ろう
kgmyshin
2
1.4k
15分で分かった気になる dumpsys
kgmyshin
1
370
UIテストはもうMaestroでいいのかもしれない話
kgmyshin
28
13k
新規開発を始めるときにやるべきこと
kgmyshin
19
9.3k
android app error handling
kgmyshin
1
1.6k
solid+cqs+dry
kgmyshin
35
10k
Paging Library ~ アイテムの更新 ~
kgmyshin
2
3.5k
KotlinでReact Native(expo) を使いたい
kgmyshin
2
1.2k
Other Decks in Programming
See All in Programming
AI Readyの正体はデータマネジメントだ メダリオン2.0の最前線
freee
PRO
0
180
Detecting Compromised CI with eBPF and Cilium Tetragon
lizrice
0
170
Google Apps Script で Ruby を動かす
kawahara
0
150
仕様駆動開発の消費期限
watany
20
7.9k
そこに3びきプロダクトがいるじゃろう——生成AI時代における“価値が届かない理由”の構造
kosuket
0
460
AI時代のPHPer生存戦略 ~「言語、もうなんでもよくない?」に本気で向き合う~
vivion
0
310
これって Effect でできたのでは? / TSKaigi Mashup Kansai #2
susisu
0
150
FDEが実現するAI駆動経営の現在地
gonta
2
280
生成AIで帳票OCRが「簡単に」作れる時代になった?
kon_shou
0
720
React本体のコードリーディング
high_g_engineer
1
140
AWS DevOps AgentのAzure接続機能を検証して見えた活用法/Use Cases Verified for the AWS DevOps Agent's Azure Connectivity Feature
masakiokuda
1
230
生成AI導入の「期待外れ」を乗り越える ー 開発フロー改革が目指す、真の組織変革
starfish719
0
4.2k
Featured
See All Featured
The Curse of the Amulet
leimatthew05
2
14k
Game over? The fight for quality and originality in the time of robots
wayneb77
1
240
No one is an island. Learnings from fostering a developers community.
thoeni
21
3.8k
Raft: Consensus for Rubyists
vanstee
141
7.6k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
Lessons Learnt from Crawling 1000+ Websites
charlesmeaden
PRO
1
1.5k
Documentation Writing (for coders)
carmenintech
77
5.4k
Believing is Seeing
oripsolob
1
180
brightonSEO & MeasureFest 2025 - Christian Goodrich - Winning strategies for Black Friday CRO & PPC
cargoodrich
3
760
The untapped power of vector embeddings
frankvandijk
2
1.8k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
9
1.5k
How to Build an AI Search Optimization Roadmap - Criteria and Steps to Take #SEOIRL
aleyda
1
2.1k
Transcript
CONFIDENTIAL © DMM.com !LHNZTIJO QPUPUJQT 4VQQPSU-JCSBSZBMQIB SFDZDMFSWJFXTFMFDUJPO
© DMM.com X w LHNZTIJOఝٶ ͗͘Έ w "OESPJEΤϯδχΞ w
%..DPNϥϘ$50ࣨॴଐ w ݄͔Β ࣗݾհ
© DMM.com X BHFOEB
© DMM.com X w SFDZDMFSWJFXTFMFDUJPOͱʁ w ͍ํ w લ४උ w
4FMFDUJPO5SBDLFSΛ࡞Δ w બঢ়ଶΛ7JFXʹө͢Δ BHFOEB
© DMM.com X SFDZDMFSWJFXTFMFDUJPO ͱʁ
© DMM.com X TVQQPSUMJCSBSZBMQIB͔Β BMQIB͔Βಋೖ ͪΖΜQSFWJFXͰ͢ ઌߦͯ͠ϦϦʔε͞Ε͍ͯΔBOESPJELUYͱಉ͡ ABOESPJEYAύοέʔδɻ ABOESPJEYAকདྷͷαϙʔτϥΠϒϥϦͰ༻͞ΕΔ ύοέʔδͰ͢ɻ
SFDZDMFSWJFXTFMFDUJPOͦͷlকདྷͷαϙʔτϥΠϒϥ ϦzͷҰͭ
© DMM.com X ͲΜͳػೳʁ
© DMM.com X ͍ํ
© DMM.com X લ४උ data class Book( val id: Long,
val title: String, val subTitle: String ) ͜ͷ#PPLͷϦετΛෳબͰ͖ΔΑ͏ʹ͠·͢
© DMM.com X લ४උ 3FDZDMFS7JFXɺ7JFX)PMEFSɺ"EBQUFSҰ୴௨ৗ௨Γ ͨͩɺTUBCMF*EΛ͏Α͏ʹ͢Δ class BookAdapter( context: Context,
private val bookList: List<Book> ) : RecyclerView.Adapter<BookViewHolder>() { init { setHasStableIds(true) } : override fun getItemId(position: Int): Long = bookList[position].id : }
© DMM.com X લ४උ 3FDZDMFS7JFXɺ7JFX)PMEFSɺ"EBQUFSҰ୴௨ৗ௨Γ ͨͩɺTUBCMF*EΛ͏Α͏ʹ͢Δ class BookAdapter( context: Context,
private val bookList: List<Book> ) : RecyclerView.Adapter<BookViewHolder>() { init { setHasStableIds(true) } : override fun getItemId(position: Int): Long = bookList[position].id : }
© DMM.com X 4FMFDUJPO5SBDLFSΠϯελϯεΛ࡞Δ selectionTracker = SelectionTracker.Builder<Long>( "my-selection-id", binding.recyclerView, StableIdKeyProvider(binding.recyclerView),
BookIdDetailsLookup(binding.recyclerView), StorageStrategy.createLongStorage()) .withOnItemActivatedListener { item, e -> Log.e("MainActivity", item.toString()) return@withOnItemActivatedListener true } .build()
© DMM.com X 4FMFDUJPO5SBDLFSΠϯελϯεΛ࡞Δ selectionTracker = SelectionTracker.Builder<Long>( "my-selection-id", binding.recyclerView, StableIdKeyProvider(binding.recyclerView),
BookIdDetailsLookup(binding.recyclerView), StorageStrategy.createLongStorage()) .withOnItemActivatedListener { item, e -> Log.e("MainActivity", item.toString()) return@withOnItemActivatedListener true } .build() ୈҰҾɻϢχʔΫͳจࣈྻΛɻ #VOEMFʹೖΕΔ,FZͱͯ͠ΘΕ·͢ɻ
© DMM.com X 4FMFDUJPO5SBDLFSΠϯελϯεΛ࡞Δ selectionTracker = SelectionTracker.Builder<Long>( "my-selection-id", binding.recyclerView, StableIdKeyProvider(binding.recyclerView),
BookIdDetailsLookup(binding.recyclerView), StorageStrategy.createLongStorage()) .withOnItemActivatedListener { item, e -> Log.e("MainActivity", item.toString()) return@withOnItemActivatedListener true } .build() ୈೋҾɻ ֘ͷ3FDZDMFS7JFXΛࢦఆ͢Δɻ
© DMM.com X 4FMFDUJPO5SBDLFSΠϯελϯεΛ࡞Δ selectionTracker = SelectionTracker.Builder<Long>( "my-selection-id", binding.recyclerView, StableIdKeyProvider(binding.recyclerView),
BookIdDetailsLookup(binding.recyclerView), StorageStrategy.createLongStorage()) .withOnItemActivatedListener { item, e -> Log.e("MainActivity", item.toString()) return@withOnItemActivatedListener true } .build() ୈࡾҾɻબதͷΞΠςϜͱબதͷLFZͷରԠΛղܾ͢ Δ*E,FZ1SPWJEFSΛࢦఆ͢Δɻࠓճͩͱ͋ΔTUBCMF*E CPPLJE ʹ͍ͨͯ͠ͲΕ͕ରͷ#PPL͔ͷؔΛղܾ͢Δɻ
© DMM.com X 4FMFDUJPO5SBDLFSΠϯελϯεΛ࡞Δ selectionTracker = SelectionTracker.Builder<Long>( "my-selection-id", binding.recyclerView, StableIdKeyProvider(binding.recyclerView),
BookIdDetailsLookup(binding.recyclerView), StorageStrategy.createLongStorage()) .withOnItemActivatedListener { item, e -> Log.e("MainActivity", item.toString()) return@withOnItemActivatedListener true } .build() ୈ࢛Ҿɻ.PUJPO&WFOUΛͱʹࠓͲ͜ͷΞΠςϜΛબͯ͠ Δͷ͔Λղܾ͢ΔɻTUBCMF*E༻͚࣌ͩࣗ͜͜࡞ɻ TUBCMF*Eඇ༻͚࣌ͩ͜͜Ͱͳ͘*E,FZ1SPWJEFSࣗ࡞͢Δɻ
© DMM.com X 4FMFDUJPO5SBDLFSΠϯελϯεΛ࡞Δ selectionTracker = SelectionTracker.Builder<Long>( "my-selection-id", binding.recyclerView, StableIdKeyProvider(binding.recyclerView),
BookIdDetailsLookup(binding.recyclerView), StorageStrategy.createLongStorage()) .withOnItemActivatedListener { item, e -> Log.e("MainActivity", item.toString()) return@withOnItemActivatedListener true } .build() ୈޒҾɻ TBWFE4UBUFʹԿΛอ࣋͢Δͷ͔Λղܾ͢Δਓɻ *UFNΛ4FMFDUJPO#VOEMFʹม͢ΔϝιουΛ࣋ͭɻ
© DMM.com X 4FMFDUJPO5SBDLFSΠϯελϯεΛ࡞Δ selectionTracker = SelectionTracker.Builder<Long>( "my-selection-id", binding.recyclerView, StableIdKeyProvider(binding.recyclerView),
BookIdDetailsLookup(binding.recyclerView), StorageStrategy.createLongStorage()) .withOnItemActivatedListener { item, e -> Log.e("MainActivity", item.toString()) return@withOnItemActivatedListener true } .build() ඞཁͩͬͨΒϦεφʔొɻ
© DMM.com X #PPL*E%FUBJMT-PPLVQΛ࡞Δ class BookIdDetailsLookup( private val recyclerView: RecyclerView
) : ItemDetailsLookup<Long>() { override fun getItemDetails(e: MotionEvent): ItemDetails<Long>? = recyclerView.findChildViewUnder( e.x, e.y )?.let { (recyclerView.getChildViewHolder(it) as? BookViewHolder)?.getItemIdDetails() } } ୈࡾҾͩͬͨ#PPL*E%FUBJMT-PPLVQͷ࣮ɻ λονΠϕϯτͷ࠲ඪ͔Βɺ֘ͷΞΠςϜΛฦ͚ͩ͢ ͷγϯϓϧͳ࣮ɻ
© DMM.com X ͜͜·Ͱ࣮ͨ͠ͷΛݟͯΈΔ
© DMM.com X 7JFXʹબঢ়ଶ͔Ͳ͏͔Λө͢Δ class BookAdapter( context: Context, private val
bookList: List<Book> ) : RecyclerView.Adapter<BookViewHolder>() { ɿ override fun onBindViewHolder( holder: BookViewHolder, position: Int ) { val item = bookList[position] holder.bind( selectionChecker?.isSelected(item.id) ?: false, position, bookList[position] ) } } TFMFDUPSΛηοτ͓͍ͯͯ͠4FMFDUJPO5SBDLFSJT4FMFDUFEͷ݁ՌΛ 7JFXTFU"DUJWBUFEͰηοτ͢Δɻ
© DMM.com X 7JFXʹબঢ়ଶ͔Ͳ͏͔Λө͢Δ class BookAdapter( context: Context, private val
bookList: List<Book> ) : RecyclerView.Adapter<BookViewHolder>() { ɿ override fun onBindViewHolder( holder: BookViewHolder, position: Int ) { val item = bookList[position] holder.bind( selectionChecker?.isSelected(item.id) ?: false, position, bookList[position] ) } } TFMFDUPSΛηοτ͓͍ͯͯ͠4FMFDUJPO5SBDLFSJT4FMFDUFEͷ݁ՌΛ 7JFXTFU"DUJWBUFEͰηοτ͢Δɻ
© DMM.com X ʂ
© DMM.com X ऴΘΓʹ
© DMM.com X ฐࣾϒϩάͰɺ͏গ͠ৄ͘͠հͯ͠·͢ IUUQTJOTJEFENNDPNFOUSZSFDZDMFSWJFXTFMFDUJPO
© DMM.com X αϯϓϧஔ͍ͯ·͢ɻ IUUQTHJUIVCDPNLHNZTIJOSFDZDMFSWJFXTFMFDUJPOTBNQMF ANBTUFSATUBCMFJEඇ༻ϒϥϯν AVTF@TUBCMF@JEATUBCMFJE༻ϒϥϯν
© DMM.com X ࠓि༵Կͯ͠·͔͢ʁ͍͠Ͱ͔͢ʁٕज़ॻయདྷͯΒ͍͍ͬͯͰ͔͢ʁ ؔͳ͍༰Ͱ͝ΊΜͳ͍͞ʂ ,6(*#",0ͱ͍͏αʔΫϧ໊Ͱग़ళ͠·͢ʂ͓࣌ؒ͋Εੋඇʂ IUUQTNPUJEBKBQBOIBUFOBCMPHDPNFOUSZ
͝੩ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ɻ