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
GDG Android - Android Adapter 어떻게 사용하는게 좋을까?
Search
TaeHwan
February 03, 2018
Programming
2
24k
GDG Android - Android Adapter 어떻게 사용하는게 좋을까?
2018/02/02 GDG Android Lightning Talk Announcement
TaeHwan
February 03, 2018
Tweet
Share
More Decks by TaeHwan
See All by TaeHwan
Compose 함수 나누는 조건은?
taehwandev
0
1.5k
Android MVVM 패턴의 접근법 - 2023 드로이드 나이츠
taehwandev
1
1.7k
안드로이드의 변화 - IO Extended 2023 - 송도
taehwandev
0
570
What’s new in Android?(Google IO ex 23-GDG Pangyo)
taehwandev
0
850
Jetpack Compose 상태 및 사이드 효과
taehwandev
0
1.1k
GDG DevFest2022 Songdo - KMM(Kotlin Multiplatform Mobile)
taehwandev
0
570
Kotlin Night 2022 - 코틀린 어노테이션으로 할 수 있는 것(GDG Seoul)
taehwandev
2
1.6k
Android module 개발 - Now in android 참고
taehwandev
3
16k
Android Compose Component - mapping.
taehwandev
2
4.7k
Other Decks in Programming
See All in Programming
ソフトウェアエンジニアの成長
masuda220
PRO
12
2.1k
Jasprが凄い話
hyshu
0
180
Datadog Workflow Automation で圧倒的価値提供
showwin
1
260
Rubyで始める関数型ドメインモデリング
shogo_tksk
0
140
SwiftUI Viewの責務分離
elmetal
PRO
2
280
Serverless Rust: Your Low-Risk Entry Point to Rust in Production (and the benefits are huge)
lmammino
1
160
なぜイベント駆動が必要なのか - CQRS/ESで解く複雑系システムの課題 -
j5ik2o
14
4.7k
生成AIで加速するテスト実装 - ロリポップ for Gamersの事例と 生成AIエディタの活用
kinosuke01
0
130
Better Code Design in PHP
afilina
0
180
バッチを作らなきゃとなったときに考えること
irof
2
530
ファインディLT_ポケモン対戦の定量的分析
fufufukakaka
0
940
Datadog DBMでなにができる? JDDUG Meetup#7
nealle
0
150
Featured
See All Featured
The Straight Up "How To Draw Better" Workshop
denniskardys
232
140k
Adopting Sorbet at Scale
ufuk
75
9.2k
It's Worth the Effort
3n
184
28k
The Art of Programming - Codeland 2020
erikaheidi
53
13k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
366
25k
Build The Right Thing And Hit Your Dates
maggiecrowley
34
2.5k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
40
2k
Designing for humans not robots
tammielis
250
25k
Product Roadmaps are Hard
iamctodd
PRO
51
11k
BBQ
matthewcrist
87
9.5k
YesSQL, Process and Tooling at Scale
rocio
172
14k
Speed Design
sergeychernyshev
27
810
Transcript
Adapter যڌѱ Ӕೞݶ જਸө? Taehwan
ViewModel ਊೞৈ ܻ࠙ೞӝ
ೞ݅ ৈӝࢲࠗఠ द — SeongUg Steve Jung(GDE) : Adapter, ־ҳջ
ք? — Data? View?
Adapter ۧѱ ҳࢿغযભ?
ۧѱ ࢎਊೞભ? class SimpleAdapter(private val context: Context, private val list:
ArrayList<String>) : RecyclerView.Adapter<SimpleAdapter.ViewHolder>() { override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): SimpleAdapter.ViewHolder { return ViewHolder(LayoutInflater.from(context).inflate(R.layout.item_text_sample, parent)) } override fun getItemCount() = list.size override fun onBindViewHolder(holder: SimpleAdapter.ViewHolder?, position: Int) { holder?.itemView?.run { tv_message.text = "Set TEXT" } } class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) }
N ѐ ViewHolderо ਃೞ class ViewHolderOne(itemView: View) : RecyclerView.ViewHolder(itemView) class
ViewHolderTwo(itemView: View) : RecyclerView.ViewHolder(itemView) class ViewHolderThree(itemView: View) : RecyclerView.ViewHolder(itemView)
N ѐ ViewHolderо ਃೞ class SimpleAdapter(private val context: Context, private
val list: ArrayList<String>) : RecyclerView.Adapter<RecyclerView.ViewHolder>() { override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): RecyclerView.ViewHolder { return when (viewType) { TYPE_ONE -> ViewHolderOne(LayoutInflater.from(context).inflate(R.layout.item_text_sample, parent)) } } override fun onBindViewHolder(holder: RecyclerView.ViewHolder?, position: Int) { when (holder) { is ViewHolderOne -> { holder.itemView?.run { tv_message.text = "ViewHolder One" } } } } override fun getItemViewType(position: Int): Int { return when (position) { else -> TYPE_ONE } } }
ViewHolder по ܻೞب۾ abstract class BaseViewHolder<in ITEM : Any>( val
context: Context, @LayoutRes layoutRes: Int, parent: ViewGroup?) : RecyclerView.ViewHolder(LayoutInflater.from(context).inflate(layoutRes, parent, false)) { fun onBindViewHolder(item: Any?) { try { onViewCreated(item as? ITEM?) } catch (e: Exception) { itemView.visibility = View.GONE } } abstract fun onViewCreated(item: ITEM?) }
BaseRecyclerAdapterীࢲب ਃۧѱ abstract class BaseRecyclerAdapter(val context: Context?) : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
override fun onBindViewHolder(holder: RecyclerView.ViewHolder?, position: Int) { (holder as? BaseViewHolder<*>)?.onBindViewHolder(getItem(position)) } // ࢤۚ }
MVP ܻ࠙о оמೠо? थש Ӗী ٮܲ ܻ࠙ — ViewHolder :
Viewਸ Ӓܻח ೡ݅ — View : Viewী ೠ interface — Model : Modelী ೠ interface -> Adapter : ୡӝച ߂ View/Model interface ࢚ࣘਸ ҳഅ -> ৻ࠗ Presenterীࢲ пп interface ഐ
ܻ࠙о оמೠо? interface ImageViewAdapterContract { interface View { val onItemTouchListener:
OnItemTouchListener? fun reload() } interface Model { fun addItem(item: RecentPhotoItem?) fun getItem(position: Int): RecentPhotoItem fun clear() } }
ܻ࠙о оמೠо? class ImageAdapter(private val context: Context) : RecyclerView.Adapter<BaseViewHolder<RecentPhotoItem>>(), ImageViewAdapterContract.View,
ImageViewAdapterContract.Model { val itemList: ArrayList<RecentPhotoItem> = ArrayList() override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int) = when (viewType) { VIEW_TYPE_ASYNC -> ImageAsyncViewHolder(context, parent, onItemTouchListener) } override fun onBindViewHolder(holder: BaseViewHolder<RecentPhotoItem>?, position: Int) { holder?.bindView(getItem(position), position) } override fun getItemViewType(position: Int) = getItem(position).viewType override fun addItem(item: RecentPhotoItem?) { item?.let { itemList.add(it) } } override fun getItem(position: Int) = itemList[position] override fun reload() { notifyDataSetChanged() } }
Ӓ۞ݶ ViewModel۽ ֈযо ࠁ
ViewModelਸ بੑ೧ࠅө? — ѱ ׳ۄח ࠗ࠙ হ݅ ViewModel۽ ҳࢿೞҊ र
— Adapterীࢲח onCreateViewHolder݅ ೞҊ र — BaseAdapter ݅ ੜ೧ࢲ ܻೞҊ र — Modelਸ ߹ب۽ ҙܻೠ -> Adapter ೡ ߹Ѣ হ
ViewModel ੌױ ٜ݅ interface BaseAdapterNavigator { fun getItemViewType(position: Int): Int
fun addItem(item: Any?, viewType: Int) fun clear() fun getItemCount(): Int }
ViewModel ੌױ ٜ݅ open class BaseAdapterViewModel(override val context: Context?) :
BaseAdapterNavigator { protected val itemList = mutableListOf<Pair<Any?, ViewHolderSealedData>>() override fun getItemViewType(position: Int): Int { val item = getPairItem(position) return when (item) { is ViewHolderInfo -> item.viewType else -> -1 } } override fun addItem(item: Any?, viewType: Int) { itemList.add(Pair(item, ViewHolderInfo(viewType))) } override fun clear() { itemList.clear() } override fun getItemCount() = itemList.size }
item ਬোೠ ࢎਊਸ ਤ೧ ViewType/ӝఋ ࠁܳ ਬোೞѱ о۰Ҋ, ইې sealed
class sealed class ViewHolderSealedData data class ViewHolderInfo( val viewType: Int) : ViewHolderSealedData()
Adapterীࢲ Model ܳ ܻ࠙ — Adapterীࢲ Model ܻ࠙ —
Adapterח ԇؘӝܳ ࢤࢿೞח ೡ ࠗ (onCreateViewHolder) — ViewHolderীࢲب BaseAdapterNavigatorਸ ా೧ࢲ Ӕ — ߡౡ ܼ द Navigator ܳ ా೧ Ӕ — ਃী ٮۄ Adapter ӝࠄ ViewModel ೧ࢲ ࢎਊ
Adapter ୡӝചח? private val adapter: BaseRecyclerAdapter by lazy { object
: BaseRecyclerAdapter(this, BaseAdapterViewModel(this)) { override fun onCreateViewHolder( parent: ViewGroup?, viewType: Int): RecyclerView.ViewHolder { // ࢤۚ } } }
؊ જ ߑध Adapter Ӕߨ? — Adapter ࢚ࣘ ҳഅਸ ୭ࣗച
दఃӝ ਤೣ — ViewModel ୡӝച݅ ೞৈ ࢎਊ оמ — ViewHolderীࢲח View ೡ݅ ೞب۾ ܻ -> ߈ࠂ ٬ਸ ӝ ਤೣ