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
930
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
630
Other Decks in Programming
See All in Programming
Goコンパイラを作ってGoをもっと理解する / Build a Go compiler to better understand Go
ikura_hamu
0
120
Web3Dライブラリを作ってVue Custom Rendererの仕組みを理解しよう / lets learn vue custom renderer by making 3d library
drumath2237
1
120
Long Living Tokens, Die, Die, Die! (or: The One Ring is Banned in Modern)
sylph01
0
410
TanStack Vue Query と Pinia Colada から学ぶ非同期状態の型設計
aoshi
0
610
現場と育てるRailsモデリング 〜Spreadsheetから始めたモデル設計〜
siroemk
2
1.2k
Spec-Driven Development - Why Vaadin Is the Perfect Fit
simas
PRO
0
220
Kawaiicon: Kubernetes, it's no longer cool, but let's secure it anyway!
barnbarn
0
100
社内AIエージェント「Askワンバン」における コストチューニングの取り組み
t0yohei
0
150
Lambda durable functionsでHuman in the Loopを楽に…楽に……
har1101
2
280
AWS CDKを理解するために公式の定義を深掘って解説してみる / Understanding AWS CDK by Digging into Its Official Definition
akihisaikeda
2
250
複数ドメインを一つのアプリに統合するFlutterの設計と運用_FlutterKaigi2026登壇資料(須永高弘)
takahirosunaga
0
150
Inertia Rails: The One-Person Framework with React & Friends
skryukov
0
380
Featured
See All Featured
Amusing Abliteration
ianozsvald
1
380
Collaborative Software Design: How to facilitate domain modelling decisions
baasie
1
370
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.4k
Have SEOs Ruined the Internet? - User Awareness of SEO in 2025
akashhashmi
0
540
Digital Ethics as a Driver of Design Innovation
axbom
PRO
1
500
HDC tutorial
michielstock
2
1k
Designing Dashboards & Data Visualisations in Web Apps
destraynor
232
55k
ピンチをチャンスに:未来をつくるプロダクトロードマップ #pmconf2020
aki_iinuma
128
56k
Bridging the Design Gap: How Collaborative Modelling removes blockers to flow between stakeholders and teams @FastFlow conf
baasie
0
760
Measuring Dark Social's Impact On Conversion and Attribution
stephenakadiri
2
320
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
800
エンジニアに許された特別な時間の終わり
watany
109
250k
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() ͷ࣮͕ෆཁ • ίʔυ͕εϦϜʹͳΓɺϝϯςφϯε͍͢͠
͡Ό ͦΏ͜ͱͰʙ