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
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
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にまかせて AIコーディングの環境改善を加速した
shoota
1
260
GitHub Copilot 最新アップデート – 「一歩先」の実践活用術
moulongzhang
5
1.7k
本当の”仕事”を手放せる未来が見えた
mu7889yoon
0
120
AIチャット検索改善の3週間
kworkdev
PRO
2
170
秘密度ラベル初心者が第1歩でつまづかないための「設計・運用」ポイント
seafay
PRO
1
480
AIネイティブな開発のサプライチェーンリスク対策 〜激動の開発現場でリスクに立ち向かう〜【ZennFes】
cscengineer
PRO
2
160
AIチャットの改善から見えた、良いAI体験とは / What Constitutes a Good AI Experience: Insights from Improving AI Chat
kubode
0
120
アジャイルな経理と Claude Code と経営の未来
kawaguti
PRO
3
190
気軽に使える"情報のハブ"としてのNotion活用 〜フロー情報の集積点 と、 Claude Code × Notion AI〜
syucream
1
180
Oracle Cloud Infrastructure:2026年6月度サービス・アップデート
oracle4engineer
PRO
0
290
4人目のSREはAgent
tanimuyk
0
150
脱SaaS!FDEを支えるプロビジョニングと分離設計
knih
0
300
Featured
See All Featured
What does AI have to do with Human Rights?
axbom
PRO
1
2.2k
Digital Projects Gone Horribly Wrong (And the UX Pros Who Still Save the Day) - Dean Schuster
uxyall
1
1.8k
Utilizing Notion as your number one productivity tool
mfonobong
4
330
The Straight Up "How To Draw Better" Workshop
denniskardys
239
140k
What the history of the web can teach us about the future of AI
inesmontani
PRO
1
620
Scaling GitHub
holman
464
140k
B2B Lead Gen: Tactics, Traps & Triumph
marketingsoph
0
160
Believing is Seeing
oripsolob
1
150
Build your cross-platform service in a week with App Engine
jlugia
234
18k
Imperfection Machines: The Place of Print at Facebook
scottboms
270
14k
Improving Core Web Vitals using Speculation Rules API
sergeychernyshev
21
1.5k
Optimising Largest Contentful Paint
csswizardry
37
3.7k
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/