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
900
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
依存関係から依存物へ―Dependencyという言葉の歴史をひも解く
j_lee
0
120
過去最大のMCPアップデート! 2026-07-28 RC版の謎に迫る
licux
6
340
Creating Composable Callables in Contemporary C++
rollbear
0
130
LLMによるContent Moderationの本番運用の裏側と品質担保への挑戦
suikabar
3
680
AIだと陥りがちなJakarta EE最新技術への移行時の落とし穴と解決策
tnagao7
0
110
キャリア迷子上等 ─ "ない道"は自分で作ればいい
16bitidol
3
2.1k
A2UI という光を覗いてみる
satohjohn
1
140
ECSアプリログをFireLensでコスト削減しようとしたけど諦めた話 in Fargate×Node.js
akihisaikeda
2
4.2k
dRuby over BLE
makicamel
2
340
net-httpのHTTP/2対応について
naruse
0
490
Oxlintのカスタムルールの現況
syumai
6
1.1k
Honoでのサプライチェーン侵害対策 〜 3つのライブラリに学ぶ
yusukebe
6
1.2k
Featured
See All Featured
How to Grow Your eCommerce with AI & Automation
katarinadahlin
PRO
1
210
Code Reviewing Like a Champion
maltzj
528
40k
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
32
3.4k
Between Models and Reality
mayunak
4
340
Java REST API Framework Comparison - PWX 2021
mraible
34
9.4k
The MySQL Ecosystem @ GitHub 2015
samlambert
251
13k
Crafting Experiences
bethany
1
180
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
How to make the Groovebox
asonas
2
2.2k
Art, The Web, and Tiny UX
lynnandtonic
304
22k
Become a Pro
speakerdeck
PRO
31
6k
Done Done
chrislema
186
16k
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() ͷ࣮͕ෆཁ • ίʔυ͕εϦϜʹͳΓɺϝϯςφϯε͍͢͠
͡Ό ͦΏ͜ͱͰʙ