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

                
<think>好的,用户想在Android Studio中用Kotlin实现RecyclerView的功能,需要示例代码和教程。首先,我需要回忆一下RecyclerView的基本组成部分,包括Adapter、ViewHolder和LayoutManager。根据引用[3]里的例子,他们提到了自定义MyRecycle以及如何设置布局管理器和适配器。那应该从这几个方面入手。 首先,用户可能需要添加依赖项,不过现在的Android项目可能已经默认包含了RecyclerView的库,但最好还是确认一下。接着,创建数据模型,比如一个简单的Item类,包含标题和内容。 然后,ViewHolder和Adapter的实现是关键。在Kotlin中,可以使用更简洁的方式来编写ViewHolder,比如在Adapter内部定义。引用[2]和[3]都提到了MutableList作为数据源,所以Adapter需要接收这样的列表,并在onBindViewHolder中绑定数据到视图上。 布局文件方面,需要创建RecyclerView的item布局和主布局中的RecyclerView控件。引用[3]中展示了如何设置不同的布局管理器,比如线性布局、水平布局和瀑布流,所以在示例中可以涵盖这些情况,但用户可能需要基础示例,先展示垂直列表。 另外,引用[4]提到在onCreate中获取View的宽高可能有问题,但在设置RecyclerView时,通常在布局文件中设置尺寸,所以这部分可能暂时不需要涉及。 最后,整合代码到Activity中,初始化RecyclerView,设置布局管理器和适配器。引用[2]和[3]中的代码示例展示了如何用apply来简化设置,这点可以借鉴,使代码更简洁。 用户可能还会关心点击事件的处理,所以在Adapter中添加点击监听也是一个好的补充。同时,生成相关问题时要考虑常见的问题,比如优化、点击事件处理、不同布局类型等,参考之前引用中的内容,比如性能优化可能涉及到引用[1]中的高级自定义,但用户现在可能需要基础的内容,所以问题可以围绕基本实现、布局管理器和数据更新。</think>在 Android Studio使用 Kotlin 实现 $RecyclerView$ 的完整步骤如下: --- ### 一、基础实现步骤 #### 1. 添加依赖 在 `build.gradle` 中添加: ```kotlin implementation("androidx.recyclerview:recyclerview:1.3.2") ``` #### 2. 创建数据模型 ```kotlin data class Item(val title: String, val content: String) ``` #### 3. 定义 Item 布局 新建 `item_layout.xml`: ```xml <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical"> <TextView android:id="@+id/tvTitle" android:layout_width="match_parent" android:layout_height="wrap_content"/> <TextView android:id="@+id/tvContent" android:layout_width="match_parent" android:layout_height="wrap_content"/> </LinearLayout> ``` #### 4. 实现 ViewHolder 和 Adapter ```kotlin class MyAdapter(private val itemList: MutableList<Item>) : RecyclerView.Adapter<MyAdapter.ViewHolder>() { inner class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { val tvTitle: TextView = itemView.findViewById(R.id.tvTitle) val tvContent: TextView = itemView.findViewById(R.id.tvContent) } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { val view = LayoutInflater.from(parent.context) .inflate(R.layout.item_layout, parent, false) return ViewHolder(view) } override fun onBindViewHolder(holder: ViewHolder, position: Int) { holder.tvTitle.text = itemList[position].title holder.tvContent.text = itemList[position].content } override fun getItemCount() = itemList.size } ``` #### 5. 在 Activity 中配置 ```kotlin class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val recyclerView = findViewById<RecyclerView>(R.id.recyclerView) recyclerView.layoutManager = LinearLayoutManager(this) // 垂直列表布局[^3] val dataList = mutableListOf( Item("标题1", "内容1"), Item("标题2", "内容2") ) recyclerView.adapter = MyAdapter(dataList) // Kotlin属性委托简化赋值[^2] } } ``` --- ### 二、关键功能扩展 #### 1. 横向列表实现 ```kotlin recyclerView.layoutManager = LinearLayoutManager(this).apply { orientation = LinearLayoutManager.HORIZONTAL // 设置横向滚动[^3] } ``` #### 2. 点击事件处理 在 Adapter 中添加: ```kotlin var onItemClick: ((Item) -> Unit)? = null override fun onBindViewHolder(holder: ViewHolder, position: Int) { holder.itemView.setOnClickListener { onItemClick?.invoke(itemList[position]) } } ``` --- ### 三、性能优化建议 1. **数据更新优化**:使用 `DiffUtil` 代替 `notifyDataSetChanged()` 实现局部刷新[^1] 2. **视图缓存**:通过 `setItemViewCacheSize()` 调整缓存数量 3. **布局优化**:对复杂 Item 布局使用 `<merge>` 标签或 `ConstraintLayout` ---
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值