Kotlin for android学习十二(布局篇):Gson

2017-11-09  本文已影响47人  crossroads

前言

kotlin官网和[kotlin教程]学习教程的笔记。

一、json格式

二、数据类

data class MovieResult(var title:String,var description:String,var movies:List<Movie>)
data class Movie(var title:String,var releaseYear:String)

三、请求类

这里记得添加Gson依赖哦~

class MovieRequest {
    companion object {
        private val MOVIE_URL = "https://facebook.github.io/react-native/movies.json"
    }

    fun execute(): MovieResult {
        val movieJson = URL(MOVIE_URL).readText()
        return Gson().fromJson(movieJson, MovieResult::class.java)
    }
}

我们需要一个类里面有一些静态的属性、常量或者函数,我们可以使用 companion object 。

四、在UI中绘制数据

  val adapter = MyAdapter(ArrayList(0)) // 创建一个空的ArrayList
        recycler.adapter = adapter
        recycler.layoutManager = LinearLayoutManager(this)
        doAsync {
            val result = MovieRequest().execute()
            uiThread {
                adapter.list = result.movies
            }
        }

五、adapter

class MyAdapter(list: List<Movie>) : RecyclerView.Adapter<MyAdapter.MyViewHolder>() {
    var list: List<Movie> = list
        set(lists) {
            field = lists
            notifyDataSetChanged()
        }

    override fun onBindViewHolder(holder: MyAdapter.MyViewHolder, position: Int) {
        with(list[position]) {
            holder.item?.text = "Released in $releaseYear is $title"
        }
    }

    override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): MyAdapter.MyViewHolder {
        return MyViewHolder(LayoutInflater.from(parent?.context).inflate(android.R.layout.simple_list_item_1, parent, false))
    }

    override fun getItemCount(): Int = list.size

    class MyViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
        val item: TextView? = itemView.find(android.R.id.text1)
    }
}

六、with let run apply also函数

1. with函数

上面,我们用到了with函数,使用它,我们就可以使用所有它的public方法和属性.

public inline fun <T, R> with(receiver: T, block: T.() -> R): R = receiver.block()

当我们针对同一个对象做很多操作的时候这个非常有利于简化代码。
with函数的返回值为函数块的最后一行,当然也可以指定return表达式。

  fun getUser(name:String): User {
        return with(name) {
            User(1, this)
        }
    }
    fun getUser(name: String): User {
        with(name) {
            return User(1, this)
        }
    }
2. let函数

let函数的返回值为函数块的最后一行,当然也可以指定return表达式。

public inline fun <T, R> T.let(block: (T) -> R): R = block(this)

调用某对象的let函数,则该对象为函数的参数。在函数块内可以通过 it 指代该对象。

    fun getUser(name: String): User {
        return name.let {
            User(2, it)
        }
    }
3. run函数

run函数的返回值为函数块的最后一行,当然也可以指定return表达式。

public inline fun <T, R> T.run(block: T.() -> R): R = block()
    fun changeUser(name: String): User {
        return name.run {
            User(1, name)
        }
    }
4. apply函数

apply函数返回值为该对象自己.

public inline fun <T> T.apply(block: T.() -> Unit): T { block(); return this }

调用某对象的apply函数,在函数块内可以通过 this 指代该对象。

fun getUser(): User {
    return User().apply {
        name = "name"
        age = 10
    }
}       
5. also函数

also函数返回值为该对象自己。

@SinceKotlin("1.1")
public inline fun <T> T.also(block: (T) -> Unit): T { block(this); return this }

调用某对象的also函数,则该对象为函数的参数。在函数块内可以通过 it 指代该对象。

fun changeUser(name: String): User {
    return User(1, "name").also {
        it.name = "changed"
    }
}
6. 当对象为null时,会发生什么情况呢?
  val user: User? = null

        user?.name.let {
            println("it is let")
        }
        with(user?.name) {
            println("it is with")
        }

        user?.name.apply {
            println("it is apply")
        }

        user?.name.run {
            println("it is run")
        }

        user?.name.also {
            println("it is also")
        }
结果

如果为null,不想让代码块执行咋办?"?"的好处就体现出来了

  val user: User? = null

        user?.name?.let {
            println("it is let")
        }
        with(user?.name) {
            println("it is with")
        }

        user?.name?.apply {
            println("it is apply")
        }

        user?.name?.run {
            println("it is run")
        }
        user?.name?.also {
            println("it is also")
        }
结果
上一篇 下一篇

猜你喜欢

热点阅读