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
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
780
俺のLTで俺のLTする
yoshiyasuko
1
620
Other Decks in Programming
See All in Programming
プロポーザルを書いてもらう
pvcresin
0
590
GKE アップグレード前に知っておきたい Blue/Green と PDB の関係
stkk
0
120
新人はどこまで自力でやり、どこからAIに頼るべきか/エンジニア育成に向き合う_先輩たちの悩みと知見共有会
toppan_digital_dev
1
360
Claude CodeとAgentCore Gatewayを繋ぐ際の認証認可 / Authentication and authorization when connecting Claude Code with AgentCore Gateway
har1101
2
420
夏だ!祭りだ!祭りとはドメインモデリングでは?
ryugen04
0
490
ソフトウェアエンジニアにとっての生成AI - 特性を知って使い倒す / generative ai for software enginner
kishida
7
2.3k
バグを直したら useEffect が消えた
colorful12
3
780
AIに既存システムを理解させる技術 ~レガシーを見捨てないハーネスエンジニアリング入門~
ochtum
0
180
KotlinConf Extended South Korea 2026 Keynote
l2hyunwoo
0
130
Discordを用いたラボオートメーション関連情報収集の自動化
noguhiro2002
0
480
レビュー履歴をAIに食わせて、 Compose移行を加速するs
shihochan
0
260
Gmail/Google DriveをトリガーにAIエージェントを動かそう! / Run AI agents with Gmail/Google Drive as triggers!
har1101
3
460
Featured
See All Featured
Deep Space Network (abreviated)
tonyrice
0
280
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
37
6.6k
Exploring anti-patterns in Rails
aemeredith
3
480
Ruling the World: When Life Gets Gamed
codingconduct
0
310
Bootstrapping a Software Product
garrettdimon
PRO
306
120k
HTML-Aware ERB: The Path to Reactive Rendering @ RubyCon 2026, Rimini, Italy
marcoroth
4
540
Reality Check: Gamification 10 Years Later
codingconduct
0
2.3k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.3k
It's Worth the Effort
3n
188
29k
First, design no harm
axbom
PRO
2
1.3k
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
680
Efficient Content Optimization with Google Search Console & Apps Script
katarinadahlin
PRO
1
830
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() ͷ࣮͕ෆཁ • ίʔυ͕εϦϜʹͳΓɺϝϯςφϯε͍͢͠
͡Ό ͦΏ͜ͱͰʙ