随着google宣布kotlin作为官方开发语言,在Android中使用kotlin的趋势也越来越明显,下面是我们在项目中常用的控件(recyclerview),那么我们在项目中怎么来将Java代码改写为kotlin代码呢,下面我们就来一步一步操作:
1、首先是我们的布局文件,没什么说的,按照原来的写法就好
2、关于控件的初始化:目前我所发现的是有两种写法
1)没有加 apply plugin: 'kotlin-android-extensions'插件
var text = findViewById(R.id.test_test) as TextView //as强制转换符号
2)apply plugin: 'kotlin-android-extensions'加上插件可以直接id.属性、
test_test.text = price
使用的主布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context="com.example.administrator.kotlinapplication.Main2Activity">
<TextView
android:id="@+id/test_test"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
<android.support.v7.widget.RecyclerView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/recycler_view"
android:text="@string/app_name" />
</LinearLayout>
activity中初始化数据(目前试过3种adapter写法都是可以的)
class Main2Activity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main2)
// var adapter = RecycleAdapter(this,initData()!!)
// var adapter = ReceycleViewAdapter(this,initData())
var adapter = RecycleAdapter2(this,initData()!!)
recycler_view.layoutManager = LinearLayoutManager(this)
recycler_view.adapter = adapter
adapter.setOnclickliseer(object :RecycleAdapter2.MyInter{ //自定义接口回调
override fun testStr(str: String) {
test_test.text = str
}
})
}
private fun initData(): ArrayList<TestVar>? {
var list=ArrayList<TestVar>()
for (i in 0..50){
var test = TestVar(i.toString(),"测试"+i,R.mipmap.ic_launcher)
list.add(i,test)
}
Log.d("tag","list.size------"+ list.size)
return list
}
}
1、recycleAdapter适配器写法(将构造函数单独写)
class RecycleAdapter : RecyclerView.Adapter<RecycleAdapter.MyViewHolder> {
private var context:Context? = null
private var list:ArrayList<TestVar>? = null
constructor(context:Context,list:ArrayList<TestVar>){
this.context = context
this.list = list
notifyDataSetChanged()
}
override fun onBindViewHolder(p0: MyViewHolder?, p1: Int) {
p0?.name!!.text = list?.get(p1)?.name
p0.image.setImageResource(list?.get(p1)?.res!!)
}
override fun onCreateViewHolder(p0: ViewGroup?, p1: Int): MyViewHolder {
return MyViewHolder(LayoutInflater.from(
context).inflate(R.layout.recyclerview_item, p0,
false))
}
override fun getItemCount(): Int {
return list?.size as Int
}
class MyViewHolder : RecyclerView.ViewHolder {
constructor(view:View) : super(view) {
name = view.findViewById(R.id.name) as TextView
image = view.findViewById(R.id.image) as ImageView
}
var name:TextView
var image:ImageView
}
}
2、recycleviewAdapter,这种写法完全是Java代码,按照原来的写法,然后在activity中按照kotlin的方式调用就好
3、recycleadapter(不单独写构造,直接在类名后加上数据,此时数据需要在类中重新定义一个变量来接收)
class RecycleAdapter2(context2:Context,list2:ArrayList<TestVar>) : RecyclerView.Adapter<RecycleAdapter2.MyViewHolder>() {
var context = context2 //接收变量
var list = list2
var inter:MyInter? = null
override fun onBindViewHolder(p0: MyViewHolder?, p1: Int) {
p0?.name?.text = list[p1].name
p0?.image?.setImageResource(list[p1].res)
p0!!.itemView.setOnClickListener {
inter?.testStr(list[p1].name)
}
}
fun setOnclickliseer(inter:MyInter){
this.inter = inter
}
override fun onCreateViewHolder(p0: ViewGroup?, p1: Int): MyViewHolder {
var view:View = LayoutInflater.from(context).inflate(R.layout.recyclerview_item, p0, false)
var holder = MyViewHolder(view)
return holder
}
override fun getItemCount(): Int {
return list?.size
}
//下面两种方式这个地方都能使用
// class MyViewHolder : RecyclerView.ViewHolder {
// constructor(view:View) : super(view) {
// name = view.findViewById(R.id.name) as TextView
// image = view.findViewById(R.id.image) as ImageView
// }
// var name:TextView
// var image:ImageView
// }
class MyViewHolder(view:View) : RecyclerView.ViewHolder(view) {
var name:TextView = view.findViewById(R.id.name) as TextView
var image:ImageView = view.findViewById(R.id.image) as ImageView
}
interface MyInter{ //自定义的接口(测试接口方式的使用)
fun testStr(str:String)
}
}
好了,到现在就写完了,只是写出了主要的代码,自定义的实体类TestVar并没有写出来,
自己随便写一个就好,由于最近才看的kotlin,代码写的冲忙,有哪儿不对的地方,希望大家能批评指正