Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
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.7k
AndroidアプリエンジニアもMCPを触ろう
kgmyshin
2
1.5k
15分で分かった気になる dumpsys
kgmyshin
1
390
UIテストはもうMaestroでいいのかもしれない話
kgmyshin
28
14k
新規開発を始めるときにやるべきこと
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
コードで差別化できない時代の ソフトウェアエンジニアリング / Software Engineering in an Era Where Code Doesn’t Differentiate
kishida
2
120
Everything will be SERVERLESS — 信じて運用した10年の経験値 / Everything Will be Serverless — Lessons Learned from 10 Years of Operational Experience
seike460
PRO
1
870
Rでドレミ/Do-Re-Mi_with_R
florets1
0
130
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
500
wkhtmltopdfの次どうするか問題2026
willnet
2
1.9k
[2026-09-26]空論ジェネリックプロセス~テスト資産とAIで紡ぐ、再現可能なパフォーマンスチューニングの話~
tosite
0
260
機械に任せるテスト、人が見るテスト ⽣成AIで引き直した、運⽤保守フェーズの線引き
dske104
0
170
Java 27新機能 / Java 27 new features
kishida
2
210
Unity6 URPによる海底をテーマにしたVJシステムの解説 | Unity Shader 完全に理解した 勉強会
gam0022
0
340
自サークルのIdPからログアウトできるようになるまで
taiseiue
1
120
月間100万人のサービス刷新で、 技術選定をHonoに振り切った話
yutobara
8
5.6k
Augmenting AI with the Power of Jakarta EE
ivargrimstad
0
500
Featured
See All Featured
Public Speaking Without Barfing On Your Shoes - THAT 2023
reverentgeek
1
590
What Being in a Rock Band Can Teach Us About Real World SEO
427marketing
0
1.1k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
The Organizational Zoo: Understanding Human Behavior Agility Through Metaphoric Constructive Conversations (based on the works of Arthur Shelley, Ph.D)
kimpetersen
PRO
0
490
The Language of Interfaces
destraynor
162
27k
Side Projects
sachag
456
43k
Color Theory Basics | Prateek | Gurzu
gurzu
1
480
Music & Morning Musume
bryan
48
7.4k
How to train your dragon (web standard)
notwaldorf
96
6.9k
The Limits of Empathy - UXLibs8
cassininazir
2
710
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
400
The Illustrated Guide to Node.js - THAT Conference 2024
reverentgeek
1
560
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
͝੩ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ɻ