前言
刚开始接触kotlin语言时,其实对于大多数人来说都是反感的,涉及到改变以往的开发习惯(java),习惯很容易养成,却很难改掉。看到网上对kotlin的评论一致的好,我也就硬着头皮看了下官方文档,试着写写代码。于是才有了这篇的文章。这次的kotlin的demo会集成retrofit和Glide 访问网络显示在listView上。
语法糖Kotlin:
1.如何理解?,!!符号
?表示空安全,也就是判断某个变量是否为空。!!表示抛出空指针。我们来看看java和Kotlin的空安 全和空指针的处理差异:
表示看着好舒服啊。。。有点小激动不?
2. @都有啥用处?
用到内部类和匿名内部类的地方一定很多,再加上支持lambda语法,没有它谁告诉你this和return到底 指的是哪一个?
而java的方法是类名.this;这个大同小异啦。
3.object的使用--单例,实例化类部内
在kotlin中object还是很常用的。在java中一个方法的形参是一个匿名类部内接口对象,比如以下代码:
那在kotlin如何实现呢?kotlin在实例化对象已经去掉new,直接类名。可以吗?匿名类部内是不行的。 正确的用法是:
4.java中的static静态,在kotlin是怎么实现呢?
kotlin环境配置:
这边要说下,开发环境是在AS2.3下,在添加kotlin的组件中,很多程序猿都会碰到当你添加kotlin插件后点击sync,一直卡在gradle。这是因为下载组件的网速太慢了,甚至没网速。这里提供一个不用翻墙的方法。
kotlin依赖不下来:
1 、下载kotlin插件,安装,重启
2、将java文件转换为kotlin文件
3、配置kotlin环境(就是代码依赖不下来)
点击配置后,在gradle中修改为国内镜像路径,这样在下载资源就优先访问国内路径。配置如下:
然后点击sync now就可以了。
kotlin代码实践
该demo涉及到retrofit和glide的使用。数据全部有访问服务器得到。
创建实体类:
推荐一个很好用的json数据转为实体类的插件:JsonToKotlinClass。都是自动生成的,速度杠杠的。
data class Data(
val message: String,
val status: String, //true
val data: MutableList<Bean>
)
data class Bean(
val news_author: String,
val news_comment_number: Int, //12
val news_image_path: String, //http://connect.lixiaoqian.cn/projects/home/cardplay/communication/news/news/images/11/cover.jpg
val news_like_number: Int, //12
val news_date: String, //2017/05/10
val news_text_path: String, //http://connect.lixiaoqian.cn/projects/home/cardplay/communication/news/news/cn/new11.html
val news_id: Int, //24
val news_title: String //“AR土楼发布会”,诸多好礼赠送,5.12就等你来!
)
创建Adapter:
class MyAdapter(var data:MutableList<Bean>?,var context:Context) : BaseAdapter() {
override fun getView(p0: Int, p1: View?, p2: ViewGroup?): View {
var viewHolder:ViewHolder
var v:View
if (p1==null){
v = LayoutInflater.from(context).inflate(R.layout.layout_item, p2, false)
viewHolder= ViewHolder(v.tv_title,v.iv_banner)
v.tag=viewHolder
}else{
v=p1
viewHolder=v.tag as ViewHolder
}
viewHolder.changTitle(data!!.get(p0).news_title)
Glide.with(context).load(data?.get(p0)?.news_image_path).into(viewHolder.iv)
return v
}
override fun getItem(p0: Int): Any {
return data!!.get(p0)
}
override fun getItemId(p0: Int): Long {
return p0.toLong()
}
override fun getCount(): Int {
return data!!.size
}
class ViewHolder(var title: TextView,var iv:ImageView){
fun changTitle(title:String){
this.title.text=title
}
}
}
获取列表资源数据:
private fun initData() {
val build = Retrofit.Builder().baseUrl(BASE_URL).addConverterFactory(GsonConverterFactory.create())
.build()
val create = build.create(com.example.huangzhibo.kotlin_demo.net.UserBean::class.java)
val data1 = create.getData(1,30)
data1.enqueue(object:Callback<Data>{
override fun onResponse(call: Call<Data>?, response: Response<Data>?) {
val myAdapter = MyAdapter(response?.body()?.data, this@MainActivity)
listView.adapter=myAdapter
}
override fun onFailure(call: Call<Data>?, t: Throwable?) {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
})
}
到这里demo的所有代码都有了。