美文网首页
Kotlin for android学习十二(布局篇):Gson

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

作者: crossroads | 来源:发表于2017-11-09 14:26 被阅读47次

    前言

    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")
            }
    
    结果

    相关文章

      网友评论

          本文标题:Kotlin for android学习十二(布局篇):Gson

          本文链接:https://www.haomeiwen.com/subject/bhhymxtx.html