Kotlin初探:用Kotlin实现Android的ListView列表
2017-05-26 17:26 阅读(260)

Kotlin 主要由 JetBrains 开发,能与 Java 互通,但拥有 Java 不支持的功能。Google 在今年 I/O 2017 开发者大会中宣布,正式把 Kotlin 纳入 Android 程序的一级开发语言(First-class language)。并且,Android Studio 3.0将会支持Kotlin,不用再安装额外插件。 
对于学习用Kotlin来开发Android还是有必要了解的,下面是本人用Kotlin写一个ListView列表时用的到Kotlin的知识,如果不准确的地方,欢迎拍砖。

1,类,继承 (界面需要集成Activity)

class Invoice{
}
class Person constructor(firstName: String){
}

如果主构造函数没有注解或可见性说明,则 constructor 关键字是可以省略:

class Person (firstName: String){
}
class Person(val name: String) {
    constructor (name: String, paret: Person) : this(name) {
        parent.children.add(this)
    }
}
open class Base(p: Int)
class Derived(p: Int) : Base(p)

如果类有主构造函数,则基类可以而且是必须在主构造函数中立即初始化。

class ListTestActivity : FragmentActivity(){
    var mListContent: ListView? = null
    var mTextTitle:TextView? = null
    var mAdapter: MyAdapter? = null
    var mDataSource: ArrayList<String>? = null
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_list_test)
        initView()
        initData()
        initListener()
    }
}

官网: http://kotlinlang.org/docs/reference/classes.html 
大神翻译: https://github.com/huanglizhuo/kotlin-in-chinese/blob/master/ClassesAndObjects/Classes-and-Inheritance.md


2,as 强制转型 (初始化控件)

fun initView() {
        mListContent = findViewById(R.id.lv_content) as ListView
        mTextTitle = findViewById(R.id.tv_title) as TextView
    }

3,初始化对象

loop@ for (i in 1..100) {
   for (j in 1..100) {
     if (...)
      break@loop
   }
}
var mDataSource: ArrayList<String>? = null
   fun initData() {
//        //静态调用
//        Person.total()
//        val data = DataBean("张三",10)
//        data.age  = 2
//        for (i in 1 until 10){
//
//        }

        mDataSource = arrayListOf()
        mAdapter = MyAdapter(mDataSource, this)
        mListContent?.adapter = mAdapter
        Handler().postDelayed({
            for (i in 0..20) {
                mDataSource?.add("index   " + i.toString())
            }
            //mAdapter? 等mAdapter为空的时候,后面不执行
            mAdapter?.notifyDataSetChanged()
        },1000)
    }

4,初始化事件响应

fun initListener(){
        mTextTitle?.setOnClickListener{
            //as? 强制转型不成功 返回Null
            //v ->   可以省略,使用关键词it
            if(validText(it as? TextView)){
                Toast.makeText(this@ListTestActivity,(it as TextView).text.toString(),Toast.LENGTH_SHORT).show()
            }
        }
        mListContent?.setOnItemClickListener {
            _, _, _, _ -> startActivity(Intent(this,TestTwoActivity::class.java))
        }
    }

5,实体类

data class User(val name: String, val age: Int)

编译器会自动的根据在主构造函数中声明的所有属性添加下面方法:

equals()/hashCode() pair, 
toString() of the form “User(name=John, age=42)”, 
componentN() 
copy() function

原文: http://kotlinlang.org/docs/reference/data-classes.html 
大神翻译: https://github.com/huanglizhuo/kotlin-in-chinese/blob/master/ClassesAndObjects/Data-Classes.md

class Person {
//    var age: Int?=null
//        get() = field
//        set(value){
//            field = value
//        }
    companion object {
        val STATE_AIDL = 1
         fun total(): String {
            return "hello"
        }
    }
}
        //调用
        Person.total()
        Person.STATE_AIDL

6,Adapter

class MyAdapter(ds: List<String>?, context: Context) : BaseAdapter() {
    var mDataSource: List<String>? = null
    var mInflater: LayoutInflater? = null
    //初始化
    init {
        mDataSource = ds
        mInflater = LayoutInflater.from(context)
    }
    override fun getCount(): Int {
//        return when (mDataSource) {
//            null -> 0
//            else -> mDataSource!!.size
//        }
        //类型安全,左边表达式为null ,返回右边;否则,返回左边,类似java三目运算符
        return mDataSource?.size?:0
    }
}
class Outer{
inner class ViewHolder {
        var textContent: TextView? = null
    }
}

官网: http://kotlinlang.org/docs/reference/nested-classes.html 
大神翻译:https://github.com/huanglizhuo/kotlin-in-chinese/blob/master/ClassesAndObjects/NestedClasses.md


最后

很早以前看过一点kotlin,只是简单的看了下。这次写的东西,让我对Kotlin有了一个更深点的理解。 
上面的内容,仅仅是这个列表用到的。还有很多如when,Ranges,枚举等等很多东西,有兴趣的可以自己看看官网,或者大神翻译的中文网站。

官网: http://kotlinlang.org/docs/reference/ 
大神翻译: https://github.com/huanglizhuo/kotlin-in-chinese



作者:笨鸟-先飞