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.5k
AndroidアプリエンジニアもMCPを触ろう
kgmyshin
2
1.4k
15分で分かった気になる dumpsys
kgmyshin
1
370
UIテストはもうMaestroでいいのかもしれない話
kgmyshin
28
13k
新規開発を始めるときにやるべきこと
kgmyshin
19
9.2k
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キャラアプリkaiwaの低遅延音声通話基盤をどう作ったか - AWS Gravitonで支える低遅延・低コストAI Agent基盤
mogamit
0
180
音楽のための関数型プログラミング言語mimiumにおける多段階計算の活用
tomoyanonymous
1
360
Android CLI
fornewid
0
150
琵琶湖の水は止められてもNet--HTTPのリトライは止められない / You might be able to stop the water flow of Lake Biwa but you can't stop Net::HTTP retries
luccafort
PRO
0
440
【やさしく解説 設計編・中級 #6】良いアーキテクチャとは ~ 一本の登り道の、行き先 ~
panda728
PRO
0
180
Prismを使った型安全な暗号化_関数型まつり2026
_fhhmm
0
150
Apache Hive: そしてCloud Native Lakehouseへ
okumin
1
170
改善しないと、タスクが回らない。 “てんこ盛りポジション” を引き継いだ情シスの、入社3ヶ月の業務改善録
krm963
0
160
Generative UI & AI-Assistants for Your Angular Solutions
manfredsteyer
PRO
0
120
アルゴリズムは何を圧縮しているのか ─ Haskell から育った「圧縮代数」というメンタルモデル
naoya
16
3.6k
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
180
人間の目はかわらない、だからJPEGは30年もつ
yuzneri
7
11k
Featured
See All Featured
The #1 spot is gone: here's how to win anyway
tamaranovitovic
3
1.1k
16th Malabo Montpellier Forum Presentation
akademiya2063
PRO
0
280
My Coaching Mixtape
mlcsv
0
180
エンジニアに許された特別な時間の終わり
watany
108
250k
The untapped power of vector embeddings
frankvandijk
2
1.8k
Writing Fast Ruby
sferik
630
63k
Reflections from 52 weeks, 52 projects
jeffersonlam
356
21k
Designing for humans not robots
tammielis
254
26k
The browser strikes back
jonoalderson
0
1.4k
Paper Plane
katiecoart
PRO
2
52k
Information Architects: The Missing Link in Design Systems
soysaucechin
0
1k
Exploring the relationship between traditional SERPs and Gen AI search
raygrieselhuber
PRO
2
4.2k
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
͝੩ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ɻ