Kotlin android-freestyle

一、 配置

  • Project/build.gradle 配置
buildscript {
    ext {
        support_version = '25.3.0'
        gradle_version = '2.3.0'
        kotlin_version = '1.1.2-3'
        anko_version = '0.8.2'
    }
    repositories {
        jcenter()
        dependencies {
            classpath 'com.android.tools.build:gradle:2.3.0'
            classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
            classpath "org.jetbrains.kotlin:kotlin-android-extensions:$kotlin_version"
        }
    }
}
  • Model/build.gradle 配置
    • kotlin-stdlib 爲基礎的依賴包
    • anko-common 爲簡化 Android 任務開發,大寫的擴展函數
    • anko-sqlite 本地數據庫
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-android-extensions'

dependencies {
    ...
    compile "com.android.support:appcompat-v7:$support_version"
    compile "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
    compile "org.jetbrains.anko:anko-common:$anko_version"
    compile "org.jetbrains.anko:anko-sqlite:$anko_version"
}

android{
    sourceSets {
        // 提示:需手動創建 kotlin 目錄
        main.java.srcDirs += 'src/main/kotlin'
    }
}

二、 實踐

step1. 頁面設計

  • activity_layout.xml 創建,跟往常一樣
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout
    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/main_rv"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</android.support.constraint.ConstraintLayout>
  • item_main.xml 同樣是沒啥特別的
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:orientation="vertical">

    <TextView
        android:id="@+id/main_item_tv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

</LinearLayout>
  • UserInfo.kt 用戶信息-數據類
    • data 作爲修飾符
    • Json 解析字段與參數名一致,也可 Serialised 實現序列化
data class UserInfo(val name: String, val age: Int)
  • MainRvAdapter.kt 適配器創建與列表項展示,有如下改變:
    • 數組取值統一採用 .[index] 形式,拋去以往的 get 函數
import android.support.v7.widget.RecyclerView
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import com.nuon.kj.MainRvAdapter.ViewHolder
import kotlinx.android.synthetic.main.item_main.view.*

class MainRvAdapter(val items: List<UserInfo>, val itemClick: (UserInfo) -> Unit)
    : RecyclerView.Adapter<ViewHolder>() {

    override fun getItemCount(): Int {
        return items.size
    }

    override fun onBindViewHolder(holder: ViewHolder?, position: Int) {
        holder?.binData(items[position])
    }

    override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): ViewHolder {
        val view = LayoutInflater.from(parent?.context).inflate(R.layout.item_main, null)
        return ViewHolder(view, itemClick)
    }

    class ViewHolder(val view: View, val itemClick: (UserInfo) -> Unit)
        : RecyclerView.ViewHolder(view) {
        // val mNameTv: TextView = view.findViewById(R.id.main_item_tv) as TextView

        fun binData(info: UserInfo) {
            with(info) {
                // mNameTv.text = name

                // 這裏通過 kotlin-android-extensions 提供的模板實現視圖獲取(id)
                view.main_item_tv.text = name
                view.main_item_tv.setTextColor(ContextCompat.getColor(view.context, R.color.colorAccent))
            }

            view.setOnClickListener {
                itemClick.invoke(info)
            }
        }
    }
}
  • MainActivity.kt 創建與視圖聲明,有如下改變:
    1. 數組定義使用 listOf 函數實現其賦值
    2. 對象定義使用 var/val 命名,類型轉換 as
    3. setLayoutManager() 由 set 函數更新爲 .layoutManager 表示
    4. 對象的實例化省去 new 字串的編輯
import android.content.Intent
import android.os.Bundle
import android.support.v7.app.AppCompatActivity
import android.support.v7.widget.LinearLayoutManager
import android.support.v7.widget.RecyclerView
import com.nuon.kj.db.UserInfo
import org.jetbrains.anko.startActivitylass MainActivity : AppCompatActivity() {

    var mMainRv: RecyclerView? = null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        initView()
    }

    fun initView() {
        val user1 = UserInfo("Joke", 22)
        val user2 = UserInfo("Ming", 26)
        val user3 = user1.copy(name = "Tome")// 對象賦值
        val userList = listOf(user1, user2, user3)

        val mMainRv = findViewById(R.id.main_rv) as RecyclerView
//        val mMainRv: RecyclerView = find(R.id.main_rv)// anko 簡化實現
        mMainRv.layoutManager = LinearLayoutManager(this)
        mMainRv.adapter = MainRvAdapter(userList) {// 擴展函數引用
//            Toast.makeText(this@MainActivity, it.name, Toast.LENGTH_SHORT).show()

//            val intent = Intent(MainActivity@this, DetailActivity::class.java)
//            intent.putExtra("userName", it.name)
//            startActivity(intent)

            startActivity<DetailActivity>("userName" to it.name)// anko 實現
        }
    }
}

step2 數據庫設計

  • UserTable.kt 創建表結構,用於存儲賬號信息
object UserTable {
    val TableName = "_user"
    val ID = "_id"
    val Pwd = "pwd"
    val UserName = "userName"
    val Age = "age"
    val Sex = "sex"
}
  • UserInfo.kt 創建表對象
data class UserInfo(val map: MutableMap<String, Any?>) {
    var _id: Long by map
    var loginId: String by map
    var pwd: String by map
    var userName: String by map
    var age: Int by map
    var sex: String by map

    constructor() : this(HashMap())

    constructor(id: Long, loginId: String, pwd: String, userName: String, age: Int, sex: String) : this(HashMap()){
        this._id = id
        this.loginId = loginId
        this.pwd = pwd
        this.userName = userName
        this.age = age
        this.sex = sex
    }
}

待更新…

Kotlin self-freestyle
Kotlin java-freestyle

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章