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
No more Adapter with Epoxy and Data Binding
Search
Takuji Nishibayashi
March 01, 2019
Technology
1.1k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
No more Adapter with Epoxy and Data Binding
Takuji Nishibayashi
March 01, 2019
More Decks by Takuji Nishibayashi
See All by Takuji Nishibayashi
compose-hot-reload を試そうとした話
takuji31
0
160
CameraX使ってみた
takuji31
0
310
kotlinx.datetime 使ってみた
takuji31
0
1.1k
HiltのCustom Componentについて
takuji31
0
380
java.timeをAndroidで使う
takuji31
0
200
KSPを使ってコード生成
takuji31
0
470
Kotlin Symbol Processing API (KSP) を使って Kotlin ア プリケーションの開発を効率化する
takuji31
1
3.2k
kotlinx.serialization
takuji31
0
690
kanmoba-returns-02.pdf
takuji31
0
290
Other Decks in Technology
See All in Technology
AI 不只幫你寫 Code: 當專案從 300 暴增到 1500, 我們如何撐住 DevOps
appleboy
0
220
FPGAの開発コンペでZephyrを使ってみた
iotengineer22
0
200
From Prompt Engineering to Loop Engineering
shibuiwilliam
1
170
自分が詳しくない領域でAIを使う #プロヒス2026
konifar
20
7.4k
脱SaaS!FDEを支えるプロビジョニングと分離設計
knih
0
300
【2026年版】 ベクトル検索とEmbedding最前線
mocobeta
23
7.5k
iOS アプリの「これって不具合ですか?」を AI に調べてもらう
miichan
0
140
AI Agentをシステムに組み込む前にゆるく向き合ってみる
hayama17
0
130
AIAU_UMEMOGU_ninomiya_slide
ninomiya_ii
0
260
コミットの「なぜ」を読む
ota1022
0
120
WebGIS AI Agentの紹介
_shimizu
0
550
AIネイティブな開発のサプライチェーンリスク対策 〜激動の開発現場でリスクに立ち向かう〜【ZennFes】
cscengineer
PRO
2
160
Featured
See All Featured
Raft: Consensus for Rubyists
vanstee
141
7.6k
How to Think Like a Performance Engineer
csswizardry
28
2.7k
The Language of Interfaces
destraynor
162
27k
SEO for Brand Visibility & Recognition
aleyda
0
4.6k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
What’s in a name? Adding method to the madness
productmarketing
PRO
24
4.1k
Documentation Writing (for coders)
carmenintech
77
5.4k
Dominate Local Search Results - an insider guide to GBP, reviews, and Local SEO
greggifford
PRO
0
200
Primal Persuasion: How to Engage the Brain for Learning That Lasts
tmiket
0
370
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
For a Future-Friendly Web
brad_frost
183
10k
Transcript
No more Adapter with Epoxy and Data Binding @takuji31 ژDev͔;͐
#5
ࣗݾհ
ࣗݾհ • @takuji31 id:takuji31 • Takuji Nishibayashi • Hatena Co.,
Ltd. • App Team • δϟϯϓϧʔΩʔʂ • ίϛοΫDAYS • ΧΫϤϜ
ࣗݾհ • Android • Kotlin • ! https://blog.takuji31.jp • "
https://nazuna.takuji31.jp • # $ https://photo.takuji31.jp
RecyclerView
ͬͯͳ͍ਓ͍·ͤΜΑͶʁ
ViewHolder + Adapter
ΦϓγϣϯͰ DiffUtil
blog.takuji31.jp/entry/kanmoba17
ෳࡶͳը໘
None
Ͳ͏࣮ݱ͢Δʁ
खͰؤுΔ
ViewHolderΛview type͝ͱʹ࡞Δ
onCreateViewHolderͰ֘͢Δ ViewHolderΛ࡞Δ
onBindViewHolderͰViewHolderͷ ܕΛݟͯΛઃఆ
มߋݕ
DiffUtilͰؤுΔ
!
Section Library
※ ͍͔ͭ͘ϥΠϒϥϦʔ͕͋Γ·͢ ͕ҰൠతͳͰ͢
view typeͷΘΓʹSectionͱ͍͏ ΫϥεΛ͏
Section class WorkSection(val items:List<Work>): Section<WorkViewHolder>() { override fun onCreateViewHolder(inflator: LayoutInflator,
parent: ViewGroup): WorkViewHolder { return WorkViewHolder(inflator.inflate(R.layout.recycle_item_work, parent, false)) } override fun onBindViewHolder(viewHolder: WorkViewHolder, position: Int) { val work = items[position] viewHolder.title = work.title Picasso.get().load(work.imageUri).into(viewHolder.imageView) } }
Adapter val adapter = Adapter() adapter.addSection(BannerSection(works)) adapter.addSection(WorkSection(works.take(10))) adapter.addSection(EntrySection(works)) adapter.addSection(WorkSection(works.drop(10)))
ύοͱݟ؆୯ͦ͏
ΫϦοΫΠϕϯτͷୡͲ͏͢Δ…ʁ class WorkSection(val items:List<Work>, val onClick: (Work) -> Unit): Section<WorkViewHolder>()
{ override fun onCreateViewHolder(inflator: LayoutInflator, parent: ViewGroup): WorkViewHolder { return WorkViewHolder(inflator.inflate(R.layout.recycle_item_work, parent, false)) } override fun onBindViewHolder(viewHolder: WorkViewHolder, position: Int) { val work = items[position] viewHolder.title = work.title Picasso.get().load(work.imageUri).into(viewHolder.imageView) viewHolder.itemView.setOnClickListener { onClick() } } }
Adapter val adapter = Adapter( {work -> viewModel.onWorkSelected(work)}, {entry ->
viewModel.onEntrySelected(entry)}, {banner -> viewModel.onBannerSelected(banner)}, ) adapter.addSection(BannerSection(works)) adapter.addSection(WorkSection(works.take(10))) adapter.addSection(EntrySection(works)) adapter.addSection(WorkSection(works.drop(10)))
ͪΐͬͱ໘
ͦͦ
Adapter -> Section -> ViewHolder
֊͕૿͑Δ
ঢ়ଶΛόϥόϥʹ͍࣋ͬͯͨΓ͢Δ ͱ෮ݩͰࢮ͵
Ϋϥε૿͑Δ
ॳݟͰΊͬͪΌΉ͍ͣ
Epoxy
github.com/airbnb/epoxy
No more
ViewHolder
notifyDataSetChanged()
Adapter
Carousel support
Data Binding Friendly
Kotlin DSL support!!!
build.gradle dependencies { implementation "com.airbnb.android:epoxy:3.3.0" implementation "com.airbnb.android:epoxy-databinding:3.3.0" kapt "com.airbnb.android:epoxy-processor:3.3.0" }
package-info.java @EpoxyDataBindingPattern(rClass = R.class, layoutPrefix = "recycler") package jp.takuji31.epoxyexample; import
com.airbnb.epoxy.EpoxyDataBindingPattern;
recycler_item_work.xml <layout> <data> <variable name="work" type="jp.takuji31.epoxyexample.model.Work" /> <variable name="onClick" type="android.view.View.OnClickListener"
/> </data> <androidx.cardview.widget.CardView android:onClick="@{onClick}"> <androidx.constraintlayout.widget.ConstraintLayout> <ImageView app:imageUri="@{work.imageUri}"/> <TextView android:text="@{work.title}"/> </androidx.constraintlayout.widget.ConstraintLayout> </androidx.cardview.widget.CardView> </layout>
Activity or Fragment recyclerView.withModels { works.forEach { work -> itemWork
{ id("work_${work.id}") work(work) } } }
None
!
Carousel
Carousel recyclerView.withModels { carousel { id("entryCaroucel") withModelsFrom(entries) { entry ->
ItemEntryBindingModel_() .id("entry_${entry.id}") .entry(entry) } } }
None
؆୯͗͢Ͱ
ෳࡶͳϨΠΞτ
ෳࡶͳϨΠΞτ Carousel.setDefaultGlobalSnapHelperFactory(null) carousel { id("bannerCarousel") withModelsFrom(banners) { ItemBannerBindingModel_() .id("banner_${it.id}") .banner(it)
} } works.take(10).forEach { work -> itemWork { id("work_${work.id}") work(work) } }
ෳࡶͳϨΠΞτ headerBlogEntry { id("blog_header") } carousel { id("entryCaroucel") withModelsFrom(entries) {
entry -> ItemEntryBindingModel_() .id("entry_${entry.id}") .entry(entry) } } works.drop(10).forEach { work -> itemWork { id("work_${work.id}") work(work) } }
ʂ
https://github.com/takuji31/epoxy- example
Enjoy RecyclerView life
! ࠾༻ใ
גࣜձࣾͯͳͰɺ ͱʹʮઓʯͰ͖Δ ؒΛืू͍ͯ͠·͢
͜ΜͳਓΛ୳͍ͯ͠·͢ • AndroidΞϓϦΛ࡞Γ͍ͨਓ • iOSΞϓϦΛ࡞Γ͍ͨਓ • ͋Δ͍྆ํ • ͳΜͳΒαʔόʔαΠυ
https://hatenacorp.jp/recruit/