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
Sponsored
·
SiteGround - Reliable hosting with speed, security, and support you can count on.
→
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
4.1k
Android MVVM 패턴의 접근법 - 2023 드로이드 나이츠
taehwandev
1
1.9k
안드로이드의 변화 - IO Extended 2023 - 송도
taehwandev
0
650
What’s new in Android?(Google IO ex 23-GDG Pangyo)
taehwandev
0
920
Jetpack Compose 상태 및 사이드 효과
taehwandev
0
1.2k
GDG DevFest2022 Songdo - KMM(Kotlin Multiplatform Mobile)
taehwandev
0
640
Kotlin Night 2022 - 코틀린 어노테이션으로 할 수 있는 것(GDG Seoul)
taehwandev
2
1.7k
Android module 개발 - Now in android 참고
taehwandev
3
18k
Android Compose Component - mapping.
taehwandev
2
4.9k
Other Decks in Programming
See All in Programming
技術検証結果の整理と解析をAIに任せよう!
keisukeikeda
0
130
最初からAWS CDKで技術検証してもいいんじゃない?
akihisaikeda
4
160
エンジニアの「手元の自動化」を加速するn8n 2026.02.27
symy2co
0
170
Takumiから考えるSecurity_Maturity_Model.pdf
gessy0129
1
150
CS教育のDX AIによる育成の効率化
niftycorp
PRO
0
150
コーディングルールの鮮度を保ちたい / keep-fresh-go-internal-conventions
handlename
0
220
Kubernetesでセルフホストが簡単なNewSQLを求めて / Seeking a NewSQL Database That's Simple to Self-Host on Kubernetes
nnaka2992
0
170
ベクトル検索のフィルタを用いた機械学習モデルとの統合 / python-meetup-fukuoka-06-vector-attr
monochromegane
2
490
「効かない!」依存性注入(DI)を活用したAPI Platformのエラーハンドリング奮闘記
mkmk884
0
120
AI駆動開発の本音 〜Claude Code並列開発で見えたエンジニアの新しい役割〜
hisuzuya
4
530
安いハードウェアでVulkan
fadis
0
650
存在論的プログラミング: 時間と存在を記述する
koriym
3
250
Featured
See All Featured
Redefining SEO in the New Era of Traffic Generation
szymonslowik
1
250
Testing 201, or: Great Expectations
jmmastey
46
8.1k
Imperfection Machines: The Place of Print at Facebook
scottboms
269
14k
Bridging the Design Gap: How Collaborative Modelling removes blockers to flow between stakeholders and teams @FastFlow conf
baasie
0
480
More Than Pixels: Becoming A User Experience Designer
marktimemedia
3
360
sira's awesome portfolio website redesign presentation
elsirapls
0
190
How To Stay Up To Date on Web Technology
chriscoyier
790
250k
Visual Storytelling: How to be a Superhuman Communicator
reverentgeek
2
480
Introduction to Domain-Driven Design and Collaborative software design
baasie
1
650
Lightning Talk: Beautiful Slides for Beginners
inesmontani
PRO
1
490
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
Digital Projects Gone Horribly Wrong (And the UX Pros Who Still Save the Day) - Dean Schuster
uxyall
0
780
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 ೡ݅ ೞب۾ ܻ -> ߈ࠂ ٬ਸ ӝ ਤೣ