在Android中使用kotlin(recyclerview的使用)

本文介绍如何将Java代码改写为Kotlin代码,并重点讲解了在Android应用中使用Kotlin进行RecyclerView适配器开发的方法。

随着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,代码写的冲忙,有哪儿不对的地方,希望大家能批评指正


                
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值