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
400
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
複数ドメインを一つのアプリに統合するFlutterの設計と運用_FlutterKaigi2026登壇資料(須永高弘)
takahirosunaga
0
160
Vapor Mode でアクセシビリティは 壊れないか検証した話
fuqda
1
330
Claude Code ハーネスDeep Dive – 君はどこまで制御する? -
takateeen_knj
6
4.3k
地方こそサーバーレス — 10年続けた、顔が見えるチームで確かな基盤を / Serverless Matters Most in Regional Areas — 10 Years of Building Reliable Foundations with Close-Knit Teams
seike460
PRO
1
320
小さなアプリを作って公開するまで
onozaty
0
150
Vue.jsで作る空間解析アプリとCapacitorプラグインのData Bridge
hal_spidernight
1
170
Modernizing iOS Apps
seyfoyun
0
150
AI Augmentation Techniques with Liberty
ivargrimstad
1
410
React Native에 현대적인 빌드 도구 더하기: Rollipop 구현기
leegeunhyeok
0
180
オーケストレーション記述言語 Katari
yukikurage
0
240
Crash Auto Pipelines
veronikapj
1
400
Будущее локальных LLM – Алексей Голобурдин, PythoNN
sobolevn
0
120
Featured
See All Featured
Claude Code のすすめ
schroneko
67
230k
Mobile First: as difficult as doing things right
swwweet
225
10k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
2.2k
[RailsConf 2023] Rails as a piece of cake
palkan
59
7.1k
Docker and Python
trallard
47
4.3k
Prompt Engineering for Job Search
mfonobong
0
580
Building a Scalable Design System with Sketch
lauravandoore
464
34k
Information Architects: The Missing Link in Design Systems
soysaucechin
1
1.3k
Leading Effective Engineering Teams in the AI Era
addyosmani
9
2.9k
JAMstack: Web Apps at Ludicrous Speed - All Things Open 2022
reverentgeek
1
670
StorybookのUI Testing Handbookを読んだ
zakiyama
31
7k
[RailsConf 2023 Opening Keynote] The Magic of Rails
eileencodes
31
10k
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
͝੩ௌ͋Γ͕ͱ͏͍͟͝·ͨ͠ɻ