前言
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")
}
结果
网友评论