Kotlin初探:用Kotlin实现Android的ListView列表

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 声明
class Invoice{
}
  • 构造函数
    类可以有一个主构造函数以及多个二级构造函数。主构造函数是类头的一部分:跟在类名后面(可以有可选的类型参数)。
class Person constructor(firstName: String){
}

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

class Person (firstName: String){
}

  • 二级构造函数
    如果类有主构造函数,每个二级构造函数都要,或直接或间接通过另一个二级构造函数代理主构造函数。在同一个类中代理另一个构造函数使用 this 关键字:
class Person(val name: String) {
    constructor (name: String, paret: Person) : this(name) {
        parent.children.add(this)
    }
}
  • 继承
    Kotlin 中所有的类都有共同的父类 Any
    声明一个明确的父类,需要在类头后加冒号再加父类:
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 强制转型 (初始化控件)

  • as “不安全”的转换符
    如果转换是不被允许的那么转换符就会抛出一个异常。因此我们称之为不安全的。在kotlin 中 我们用前缀 as 操作符
  fun initView() {
        mListContent = findViewById(R.id.lv_content) as ListView
        mTextTitle = findViewById(R.id.tv_title) as TextView
    }
  • as?
    为了避免抛出异常,可以用 as? 这个安全转换符,这样失败就会返回 null

3,初始化对象

  • kotlin 没有new 关键字,直接初始化
  • Kotlin 里面List没有设置数据的方法,直接使用ArrayList
  • for循环, 中断和继续标签
loop@ for (i in 1..100) {
   for (j in 1..100) {
     if (...)
      break@loop
   }
}
  • initData()
    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,初始化事件响应

  • lambda 表达式
    当就一个参数时,可以省略。用内部的 “it” 来替代。
    当参数不使用的时候,可以用 “_” 来取代
  • this@ListTestActivity 确认指向
    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 数据类
    我们经常创建一个类,除了持有数据,其他的什么也不做。在这样的类里,一些标准功能往往是重复的。在Kotlin,这被称为 data class 和标记为数据:
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

  • companion object 静态属性,方法
    Kotlin 移除了 static 的概念。通常用 companion object 来实现类似功能
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
    }
} 
  • 嵌套类(ViewHolder)
    类可以标记为 inner 这样就可以访问外部类的成员。内部类拥有外部类的一个对象引用:
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

猜你喜欢

转载自blog.csdn.net/ecliujianbo/article/details/72769803