Fatemeh Movassaghpour
Fatemeh Movassaghpour
خواندن ۴ دقیقه·۴ سال پیش

آموزش کار با Epoxy در اندروید - قسمت ۲ (کاتلین)

Epoxy
Epoxy

اگه قسمت قبلی خونده باشین بریم که قسمت دوم اختصاصی برای کاتلین شروع کنیم و اگر نه حتما اول قسمت اول مطالعه کنید.

قسمت اول


قبلا هم گفتیم که دو مفهوم epoxy model , epoxy controller توی این لایبری خیلی مهم هست حالا توی کاتلین علاوه بر چیز هایی که قبلا گفتیم میشه از این روش هم اقدام کرد.

اول ) Kotlin Model : کافی این کلاس به پروژه اضافه کنیم و model هامون رو از اون extend کنیم :

import android.view.View import androidx.annotation.IdRes import androidx.annotation.LayoutRes import com.airbnb.epoxy.EpoxyModel import kotlin.properties.ReadOnlyProperty import kotlin.reflect.KProperty /** * A pattern for using epoxy models with Kotlin with no annotations or code generation. * * See [com.airbnb.epoxy.kotlinsample.models.ItemDataClass] for a usage example. */ abstract class KotlinModel( @LayoutRes private val layoutRes: Int ) : EpoxyModel<View>() { private var view: View? = null abstract fun bind() override fun bind(view: View) { this.view = view bind() } override fun unbind(view: View) { this.view = null } override fun getDefaultLayout() = layoutRes protected fun <V : View> bind(@IdRes id: Int) = object : ReadOnlyProperty<KotlinModel, V> { override fun getValue(thisRef: KotlinModel, property: KProperty<*>): V { // This is not efficient because it looks up the view by id every time (it loses // the pattern of a &quotholder&quot to cache that look up). But it is simple to use and could // be optimized with a map @Suppress(&quotUNCHECKED_CAST&quot) return view?.findViewById(id) as V? ?: throw IllegalStateException(&quotView ID $id for '${property.name}' not found.&quot) } } }

علاوه بر اون میشه خیلی راحت و برحسب نیازمون اون کاستوم کنیم.

حالا کافیه بیایم و مدل مون دوباره بسازیم :

class HeaderViewWithKotlinModelEpoxy( private val title:String ) :KotlinModel(R.layout.header_view) { private val titleView by bind<TextView>(R.id.title) override fun bind() { titleView.text = title } }

همانطور که می بینید خیلی ساده model مون ساخته شد و دیگه نیازی به اون annotationها و view holder ها نیست و خیلی راحت میشه دیتا رو از طریق constructor به Model فرستاد و از طریق Kotlin Model ویو که قرار inflate بشه رو بهش معرفی کرد.

و در مرحله بعدی باید بریم سراغ controller

دوم ) Epoxy Controller : برای اینکار اومدن از طریق Kotlin Extensions به سادگی و بدون نیاز به کلاس controller اونو پیاده سازی کردند

headerList.withModels { HeaderViewWithKotlinModelEpoxy(&quotfood&quot).apply{ id(1) as KotlinModel }.addTo(this) HeaderViewWithKotlinModelEpoxy(&quotgame&quot).apply{ id(2) }.addTo(this) HeaderViewWithKotlinModelEpoxy(&quotcode&quot).apply{ id(3) }.addTo(this) HeaderViewWithKotlinModelEpoxy(&quotbook&quot).apply{ id(4) }.addTo(this) }

که withModels یه extention که برای epoxy تعریف شده و از طریق اون و بدون نیاز به هیچ کلاس controller میشه همه مدل ها که شامل مدل های متفاوت هم می تونه باشه پیاده سازی کرد.

نسب به کدهای قسمت قبل خیلی کمتر و کارمون خیلی ساده تر شد.

سادگی در پیاده سازی و راحت بودنش صفحه رو شبیه یه پازل می کنه که کافی تیکه های پازل کنار هم گذاشت و راحت اون ساخت :))

لایبرری epoxy کلی ویژگی های خوب دیگه ام داره که سعی می کنم توی مقاله های بعدی درباره اشون بنویسم.

اگه تجربه ای از استفاده epoxy توی پروژه هاتون دارین خوشحال می شم زیر همین پست بنویسید.


منابع :

https://github.com/airbnb/epoxy/wiki



برنامه نویسیاندرویدepoxyrecyclerviewandroid
Android Developer
شاید از این پست‌ها خوشتان بیاید