کاتلین فارسی

فهرست

الف ) درباره این کتاب

ب ) آیا این کتاب مناسب شماست؟

پ ) درباره نویسنده

ت ) چند سخن مترجم

1 - معرفی

1.1 )‌ کاتلین چیست؟

1.2 ) با کاتلین به چه میرسیم؟

2 - آماده شدن

2.1 ) اندروید استودیو

2.2 ) نصب پلاگین کاتلین

3 - ساختن یک پروژه جدید

3.1 ) ساختن پروژه در اندروید استودیو

3.2 ) تنظیمات گردل

3.3 ) تبدیل MainActivity به کد کاتلین

3.4 ) تست کارکردن همه اجزا

4 - کلاس ها و توابع

4.1 ) روش تعریف کلاس

4.2 ) ارث بری

4.3 ) توابع

4.4 ) کانستراکتور و پارامترها

5 - نوشتن اولین کلاس

5.1 ) ساختن layout

5.2 ) آداپتور Recycler

6 - مقادیر و خصیصه ها

6.1 ) type های پایه ای

6.2 ) متغیر ها

6.3 ) خصیصه ها

7 - Anko و توابع الحاقی

7.1 ) Anko چیست؟

7.2 ) شروع به استفاده از Anko

7.3 ) توابع الحاقی

8 - بدست آوردن دیتا با استفاده از API

8.1 ) انجام درخواست

8.2 ) انجام درخواست خارج از نخ اصلی

9 - کلاس های دیتا

9.1 ) توابع اضافی

9.2 ) کپی کردن کلاس دیتا

9.3 ) مپ کردن یک آبجکت به متغیرها

10 - تجزیه دیتا

10.1 ) تبدیل JSON به کلاس های دیتا

10.2 ) شکل دادن به لایه ی domain

10.3 ) نمایش دیتا بر روی UI

11 - Overloading Operators

11.1 ) جدول اوپراتور ها

11.2 ) یک مثال

11.3 ) عملگرها در توابع الحاقی

12 - تجزیه دیتا

بقیه فصل ها در حال ترجمه است

نوشتن اولین کلاس

ویرایش

خب ما تا الان فایل MainActivity.kt مون رو درست کردیم.ولی اگه یادتون باشه قرار بود یک اپ پیشبینی آب و هوا درست کنیم و باید توی صفحمون از پیشبینی آب و هوای هفته بعد گفته بشه پس نیاز به یک سری تغییرات داریم.

ساختن layout

بهترین view که میتونه لیست پیش بینی آب و هوا بسازه یک RecyclerView هه و بنابراین به یک وابستگی نیازمنده.بنابراین نیاز داریم که build.gradle رو تغییر بدیم:

dependencies {
    compile fileTree(dir: 'libs', include: ['*.jar'])
    compile "com.android.support:appcompat-v7:$support_version"
    compile "com.android.support:recyclerview-v7:$support_version"
    // ...
}

و حالا بریم سر activity_main.xml و اونو تغییر بدیم:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <android.support.v7.widget.RecyclerView
        android:id="@+id/forecast_list"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
</FrameLayout>

داخل MainActivity.kt اون خط کدی که نوشتیم برای تست رو پاک میکنیم.همینطور که گفتیم اگه بخوایم کامپوننتی رو از توی xml صدا بزنیم کافیه از idیش استفاده کنیم.ولی فعلا به همون روش قدیمی استفاده از findViewById ادامه میدیم:

val forecastList = findViewById(R.id.forecast_list) as RecyclerView
forecastList.layoutManager = LinearLayoutManager(this)

همینطور که میبینین ما یک متغیر تعریف کردیم و به RecyclerView کستش کردیم.و همچنین به جای setter خودمون مستقیم به layoutManager دسترسی پیداکردیم.یک لیست برای این layout کافیه پس به استفاده از یک LinearLayoutManager بسنده کردیم.

نمونه سازی: اگه دقت کنین اینجا دیگه از کلیدواژه new استفاده نشد! در واقع برای ساختن یک شی دیگه نیازی به استفاده از new نیست تنها کافیه از نام کلاس و سازنده اش استفاده بشه.

آداپتور Recycler

همینطور که متوجه شدین اینجا نیازمند یک اداپتور برای RecyclerView مون هستیم.فعلا تنها از یک TextView برای RecyclerView استفاده میکنیم. یک لیست ساده از text ها چیزیه که فعلا بهش نیاز داریم.لازمه که یک فایل کاتلین به نام ForecastListAdapter.kt باز کنیم و کدهای زیر رو داخلش بزنیم:

class ForecastListAdapter(val items: List<String>) :
        RecyclerView.Adapter<ForecastListAdapter.ViewHolder>() {
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int):
            ViewHolder {
        return ViewHolder(TextView(parent.context))
    }
    override fun onBindViewHolder(holder: ViewHolder,
                                  position: Int) {
        holder.textView.text = items[position]
    }
    override fun getItemCount(): Int = items.size
    class ViewHolder(val textView: TextView) : RecyclerView.ViewHolder(textView)
}

برگردیم به MainActivity، حالا لازمه که یک لیست از رشته ها درست کنیم و بعدا به آداپتورمون بدیم:

private val items = listOf(
        "Mon 6/23 - Sunny - 31/17",
        "Tue 6/24 - Foggy - 21/8",
        "Wed 6/25 - Cloudy - 22/17",
        "Thurs 6/26 - Rainy - 18/11",
        "Fri 6/27 - Foggy - 21/10",
        "Sat 6/28 - TRAPPED IN WEATHERSTATION - 23/18",
        "Sun 6/29 - Sunny - 20/7"
)
override fun onCreate(savedInstanceState: Bundle?) {
    // ...
    val forecastList = findViewById(R.id.forecast_list) as RecyclerView
    forecastList.layoutManager = LinearLayoutManager(this)
    forecastList.adapter = ForecastListAdapter(items)
}

اگر مفهومی رو از کالکشن و لیستمون متوجه نشدین نگران نباشین، بعدا راجع بهش صحبت میکنیم.فعلا فقط بدونین که یک لیست غیرقابل تغییر رو با استفاده از تابع listOf() میتونیم درست کنیم.اون ازمون یک آرایه از ورودی ها میگیره و برامون لیست رو درست میکنه.تابع های دیگه ای هم هستن که تقریبا همین کار رو انجام میدن ولی خب بعدا راجبشون صحبت میکنیم.