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
Groupieやってみよう
Search
Yoshiyasu KO
March 14, 2019
Programming
920
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Groupieやってみよう
Android Night 2019/03
Yoshiyasu KO
March 14, 2019
More Decks by Yoshiyasu KO
See All by Yoshiyasu KO
Kotlin 1.3 さらっとContracts + α
yoshiyasuko
2
780
俺のLTで俺のLTする
yoshiyasuko
1
620
Other Decks in Programming
See All in Programming
カツオ、ご期待ください
suneo3476
0
120
AI時代のコードレビューは人に向けるな、仕組みに向けろ
texmeijin
5
3k
Omarchy Tokyo やると聞いて UMPC 買ってセットアップしてきた
mtsmfm
0
190
モデルのリファクタリングが難しいと思ったら、そもそも複雑だったのはビジネス仕様だった ? / is-the-business-domain-the-real-complexity
hatsu38
0
430
iOSDC Japan 2026 - Swiftで作って学ぼう!データベース自作入門
kaseken
2
400
手動確認はもう限界 〜XCUITestでCustom URL Schemeの遷移を起動種別ごとに自動テストする〜 / Testing Custom URL Schemes with XCUITest
otouto
0
360
海上で動くGoサーバー: goroutineとchannelでさばく航行データストリーム
atsuki_seo
0
1k
スマートフォンでモールス信号を送受信する 〜スマートフォンのLEDとカメラで作る光通信の設計と実装〜
atsuki_seo
0
210
JAWS-UG 東京支部が始める、JAWS-UG支部コラボ / JAWS-UG lunchtime LT Collaboration
y0hgi
0
170
Ghostty + Neovimで作る 透明でカッコ良い開発環境
j341nono
0
150
KiroのSpecで「五目並べ」を作ってみる
satoshi256kbyte
1
310
[ハンズオン]AIへの指示だけで「五目並べ」を作ってみよう
satoshi256kbyte
1
300
Featured
See All Featured
Future Trends and Review - Lecture 12 - Web Technologies (1019888BNR)
signer
PRO
0
3.8k
Optimising Largest Contentful Paint
csswizardry
37
4k
Groundhog Day: Seeking Process in Gaming for Health
codingconduct
0
380
The untapped power of vector embeddings
frankvandijk
2
1.9k
GraphQLの誤解/rethinking-graphql
sonatard
75
12k
How To Speak Unicorn (iThemes Webinar)
marktimemedia
1
590
Claude Code どこまでも/ Claude Code Everywhere
nwiizo
68
58k
Getting science done with accelerated Python computing platforms
jacobtomlinson
2
490
Marketing to machines
jonoalderson
1
5.8k
Tips & Tricks on How to Get Your First Job In Tech
honzajavorek
1
780
The Impact of AI in SEO - AI Overviews June 2024 Edition
aleyda
6
1.2k
Optimizing for Happiness
mojombo
378
71k
Transcript
GroupieͬͯΈΑ͏ ߴɹՅହ Android Night 2019/03
ϓϩϑΟʔϧ • ໊લ: ߴ Յହ (Yoshiyasu KO) • ॴଐ: ϕΨίʔϙϨʔγϣϯ
• AndroidΤϯδχΞ • : @dashimaki_dofu
ϓϩϑΟʔϧ ʮ͠ΜͪΌΜͷਓʯͱ֮͑ͯؼ͍ͬͯͩ͘͞ • ໊લ: ߴ Յହ (Yoshiyasu KO) • ॴଐ:
ϕΨίʔϙϨʔγϣϯ • AndroidΤϯδχΞ • : @dashimaki_dofu
ࠓ͢͜ͱ • GroupieͬͯԿʁ • Groupieͷ؆୯ͳ͍ํ
GroupieͬͯԿʁ
RecyclerViewΛͬ͘͞ͱ ࣮Ͱ͖ΔϥΠϒϥϦ
None
ૉʹ࣮ͯ͠ΈΔ
ૉʹ࣮ͯ͠ΈΔ class HelloWorldViewHolder private constructor(view: View) : RecyclerView.ViewHolder(view) { companion
object { fun generate(parent: ViewGroup, inflater: LayoutInflater): HelloWorldViewHolder { val view = inflater.inflate(R.layout.hello_world_view, parent, false) return HelloWorldViewHolder(view) } } fun onBind() { /* Կ͔Viewͷૢ࡞Λߦ͏ */ } } ViewHolder ͷ࣮ ※ಉ༷ʹ AndroidHelloViewHolder ࡞Δ
ૉʹ࣮ͯ͠ΈΔ companion object { const val TYPE_HELLO = 0 const
val TYPE_ANDROID = 1 } Adapter ͷ࣮ - ViewType ͷઃఆ
ૉʹ࣮ͯ͠ΈΔ override fun getItemCount(): Int = items.size Adapter ͷ࣮ -
getItemCount()
ૉʹ࣮ͯ͠ΈΔ override fun getItemViewType(position: Int): Int { val item =
items[position] as Data return item.type } Adapter ͷ࣮ - getViewType()
ૉʹ࣮ͯ͠ΈΔ override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) : RecyclerView.ViewHolder {
val inflater = LayoutInflater.from(context) return when (viewType) { TYPE_HELLO -> HelloWorldViewHolder.generate(parent, inflater) TYPE_ANDROID -> AndroidHelloViewHolder.generate(parent, inflater) else -> super.createViewHolder(parent, viewType) } } Adapter ͷ࣮ - onCreateViewHolder()
ૉʹ࣮ͯ͠ΈΔ override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) { when (holder)
{ is HelloWorldViewHolder -> holder.onBind() is AndroidHelloViewHolder -> holder.onBind() } } Adapter ͷ࣮ - onBindViewHolder()
ૉʹ࣮ͯ͠ΈΔ // MainActivity#onCreate val items = (0 until 20).map {
val type = it % 2 RecyclerAdapter.Data(type) }.toMutableList() val recyclerView = findViewById<RecyclerView>(R.id.recycler_view) recyclerView.layoutManager = LinearLayoutManager(this) recyclerView.adapter = RecyclerAdapter(this, items) RecyclerView ʹ Adapter Λઃఆ
GroupieͩͱͲ͏ͳΔʁ
GroupieͩͱͲ͏ͳΔʁ dependencies { implementation 'com.xwray:groupie:2.3.0' } લ४උ: app/gradle ʹ Groupie
ΛՃ
GroupieͩͱͲ͏ͳΔʁ class HelloWorldItem : Item<ViewHolder>() { override fun getLayout(): Int
= R.layout.hello_world_view override fun bind(viewHolder: ViewHolder, position: Int) { /* Կ͔Viewͷૢ࡞Λߦ͏ */ } } Item ͷ࣮ ※ಉ༷ʹ AndroidHelloItem ࡞Δ
GroupieͩͱͲ͏ͳΔʁ // GroupieActivity#onCreate val items = (0 until 20).map {
when (it % 2) { 0 -> HelloWorldItem() 1 -> AndroidHelloItem() else -> HelloWorldItem() } }.toMutableList() val groupAdapter = GroupAdapter<ViewHolder>() recyclerView.adapter = groupAdapter groupAdapter.update(items) GroupAdapter ͷઃఆ
ऴΘΓͰ͢
؆୯Ͱ͢Ͷ
Կ͕خ͍͠ʁ
Կ͕خ͍͠ʁ 1. ViewHolder ͷ࣮ 2. ViewType ͷઃఆ 3. getItemCount() ͷ࣮
4. getViewType() ͷ࣮ 5. onCreateViewHolder() ͷ࣮ 6. onBindViewHolder() ͷ࣮ 7. RecyclerViewʹ Adapter ઃఆ 1. Item ͷ࣮ 2. RecyclerViewʹ Adapter ઃఆ σϑΥϧτ (SPVQJF
Կ͕خ͍͠ʁ 1. ViewHolder ͷ࣮ 2. ViewType ͷઃఆ 3. getItemCount() ͷ࣮
4. getViewType() ͷ࣮ 5. onCreateViewHolder() ͷ࣮ 6. onBindViewHolder() ͷ࣮ 7. RecyclerViewʹ Adapter ઃఆ 1. Item ͷ࣮ 2. RecyclerViewʹ Adapter ઃఆ σϑΥϧτ (SPVQJF
Կ͕خ͍͠ʁ 1. ViewHolder ͷ࣮ 2. ViewType ͷઃఆ 3. getItemCount() ͷ࣮
4. getViewType() ͷ࣮ 5. onCreateViewHolder() ͷ࣮ 6. onBindViewHolder() ͷ࣮ 7. RecyclerViewʹ Adapter ઃఆ 1. Item ͷ࣮ 2. RecyclerViewʹ Adapter ઃఆ σϑΥϧτ (SPVQJF *UFN͕ʙͷॲཧΛ Ӆṭͯ͠શ෦ͬͯ͘ΕΔ
Կ͕خ͍͠ʁ 1. ViewHolder ͷ࣮ 2. ViewType ͷઃఆ 3. getItemCount() ͷ࣮
4. getViewType() ͷ࣮ 5. onCreateViewHolder() ͷ࣮ 6. onBindViewHolder() ͷ࣮ 7. RecyclerViewʹ Adapter ઃఆ 1. Item ͷ࣮ 2. RecyclerViewʹ Adapter ઃఆ σϑΥϧτ (SPVQJF *UFN͕ʙͷॲཧΛ Ӆṭͯ͠શ෦ͬͯ͘ΕΔ ಛʹ͜͜
companion object { const val TYPE_A = 0 const val
TYPE_B = 1 const val TYPE_C = 2 const val TYPE_D = 3 const val TYPE_E = 4 const val TYPE_F = 5 const val TYPE_G = 6 const val TYPE_H = 7 const val TYPE_I = 8 const val TYPE_J = 9 const val TYPE_K = 10 const val TYPE_L = 11 const val TYPE_M = 12 const val TYPE_N = 13 const val TYPE_O = 14 const val TYPE_P = 15 const val TYPE_Q = 16 const val TYPE_R = 17 const val TYPE_S = 18 const val TYPE_T = 19 const val TYPE_U = 20 const val TYPE_V = 21 const val TYPE_W = 22 const val TYPE_X = 23 const val TYPE_Y = 24 const val TYPE_Z = 25 } ΧΦεͳ7JFX5ZQF
companion object { const val TYPE_A = 0 const val
TYPE_B = 1 const val TYPE_C = 2 const val TYPE_D = 3 const val TYPE_E = 4 const val TYPE_F = 5 const val TYPE_G = 6 const val TYPE_H = 7 const val TYPE_I = 8 const val TYPE_J = 9 const val TYPE_K = 10 const val TYPE_L = 11 const val TYPE_M = 12 const val TYPE_N = 13 const val TYPE_O = 14 const val TYPE_P = 15 const val TYPE_Q = 16 const val TYPE_R = 17 const val TYPE_S = 18 const val TYPE_T = 19 const val TYPE_U = 20 const val TYPE_V = 21 const val TYPE_W = 22 const val TYPE_X = 23 const val TYPE_Y = 24 const val TYPE_Z = 25 } ❌ ΧΦεͳ7JFX5ZQF
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) : RecyclerView.ViewHolder { val
inflater = LayoutInflater.from(context) return when (viewType) { TYPE_A -> AViewHolder.generate(parent, inflater) TYPE_B -> BViewHolder.generate(parent, inflater) TYPE_C -> CViewHolder.generate(parent, inflater) TYPE_D -> DViewHolder.generate(parent, inflater) TYPE_E -> EViewHolder.generate(parent, inflater) TYPE_F -> FViewHolder.generate(parent, inflater) TYPE_G -> GViewHolder.generate(parent, inflater) TYPE_H -> HViewHolder.generate(parent, inflater) TYPE_I -> IViewHolder.generate(parent, inflater) TYPE_J -> JViewHolder.generate(parent, inflater) TYPE_K -> KViewHolder.generate(parent, inflater) TYPE_L -> LViewHolder.generate(parent, inflater) TYPE_M -> MViewHolder.generate(parent, inflater) // ... // else -> super.createViewHolder(parent, viewType) } } ΧΦεͳ7JFX5ZQFʹҾͬுΒΕͨΧΦεͳϝιουୡ
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) : RecyclerView.ViewHolder { val
inflater = LayoutInflater.from(context) return when (viewType) { TYPE_A -> AViewHolder.generate(parent, inflater) TYPE_B -> BViewHolder.generate(parent, inflater) TYPE_C -> CViewHolder.generate(parent, inflater) TYPE_D -> DViewHolder.generate(parent, inflater) TYPE_E -> EViewHolder.generate(parent, inflater) TYPE_F -> FViewHolder.generate(parent, inflater) TYPE_G -> GViewHolder.generate(parent, inflater) TYPE_H -> HViewHolder.generate(parent, inflater) TYPE_I -> IViewHolder.generate(parent, inflater) TYPE_J -> JViewHolder.generate(parent, inflater) TYPE_K -> KViewHolder.generate(parent, inflater) TYPE_L -> LViewHolder.generate(parent, inflater) TYPE_M -> MViewHolder.generate(parent, inflater) // ... // else -> super.createViewHolder(parent, viewType) } } ❌ ΧΦεͳ7JFX5ZQFʹҾͬுΒΕͨΧΦεͳϝιουୡ
ίʔυྔΊͬͪΌݮΔ = ϝϯςφϯε͘͢͠ͳΔ
ͦͷଞͷػೳ • BindingItem<ViewDataBinding> • DataBindingΛར༻Ͱ͖Δ • Section • ϔομϓϨʔεϗϧμʔΛઃఆͰ͖Δ
ৄ͍͜͠ͱ... • Groupie Λ͔ͭͬͯΈΔ • https://qiita.com/aluceps/items/ 86208987f4c07331bfa0 • RecyclerViewʹΑΔϨΠΞτΛָʹ͢ΔGroupieΛ1 ͬͯΈͯ
• https://qiita.com/takahirom/items/ 4125d7c871fad534d3c2
ࠓͨ͜͠ͱ • GroupieͬͯԿʁ • RecyclerViewΛͬ͘͞ͱ࣮Ͱ͖ΔϥΠϒϥϦ • Ͳ͏ָʹͳΔͷʁ • جຊItem ࡞ͬͯɺGroupAdapterʹઃఆ͢Δ͚ͩ
• Կ͕خ͍͠ʁ • ViewType onCreateViewHolder() ͷ࣮͕ෆཁ • ίʔυ͕εϦϜʹͳΓɺϝϯςφϯε͍͢͠
͡Ό ͦΏ͜ͱͰʙ