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
Groupieやってみよう
Search
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
Yoshiyasu KO
March 14, 2019
Programming
910
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
770
俺のLTで俺のLTする
yoshiyasuko
1
610
Other Decks in Programming
See All in Programming
PHP に部分適用が来るぞ!……ところで何それ?おいしいの? #phpcon / phpcon-2026
shogogg
0
580
Laravel Boostに学ぶ、AIにPHPを書かせる技術 〜OSSの実装から蒸留するエージェント制御の王道〜
kentaroutakeda
3
670
5分で問診!Composer セキュリティ健康診断
codmoninc
0
890
VibeCodingからAgenticWorkflowへ
starfish719
0
300
【やさしく解説 設計編・中級 #1】一つの車に、運転手は一人 ~ある倉庫システムの事例から~
panda728
PRO
0
200
freee が目指す データ マネジメント戦略 AI-Ready 時代を支える 攻めのガバナンスとは
freee
PRO
0
290
JAWS-UG横浜 #102 AWSサ終供養LT会 成仏できない AWS サービスたち 〜本日、三体供養します〜
maroon1st
0
330
Welcome to the "Parametricity" 🏙️ − Generic だけど Specific な世界 −
guvalif
PRO
1
200
Built Our Own Background Agent at LayerX
layerx
PRO
9
5k
変わらないものが、変わるものを決める — 意図駆動開発 × イベントソーシング × イミュータブル | What Doesn't Change Decides What Can — IDD × Event Sourcing × Immutability
tomohisa
0
1.3k
Japan Community Day at Kubecon + CloudNativeCon Japan 2026: Learning Container Privilege Control by Building My Own Low-Level Container Runtime
ternbusty
1
140
作るコストが小さくなった時代 幸せに働くために改めて考えたいこと 〜エンジニアとして価値を出し続けるために注視している二分野〜
yuppeeng
0
190
Featured
See All Featured
Agile Leadership in an Agile Organization
kimpetersen
PRO
0
200
The Anti-SEO Checklist Checklist. Pubcon Cyber Week
ryanjones
0
200
Tips & Tricks on How to Get Your First Job In Tech
honzajavorek
1
670
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
201
75k
Discover your Explorer Soul
emna__ayadi
2
1.2k
Kristin Tynski - Automating Marketing Tasks With AI
techseoconnect
PRO
0
440
4 Signs Your Business is Dying
shpigford
187
22k
Marketing to machines
jonoalderson
1
5.6k
Getting science done with accelerated Python computing platforms
jacobtomlinson
2
400
Impact Scores and Hybrid Strategies: The future of link building
tamaranovitovic
0
370
[Rails World 2023 - Day 1 Closing Keynote] - The Magic of Rails
eileencodes
38
2.9k
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() ͷ࣮͕ෆཁ • ίʔυ͕εϦϜʹͳΓɺϝϯςφϯε͍͢͠
͡Ό ͦΏ͜ͱͰʙ