Kotlin实现recyclerView列表

Kotlin实现recyclerView列表

主要是熟悉Kotlin的语法,其中没什么比较难的点。

布局非常简单,不多说了,直接看下面的代码。

<?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"
    tools:context="com.example.lxrent.myapplication.MainActivity">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <android.support.v7.widget.RecyclerView
            android:id="@+id/recyclerView"
            android:layout_width="match_parent"
            android:layout_height="match_parent" />
    </LinearLayout>

</LinearLayout>

下面介绍adapter的写法,主要区分一下和以前adapterd的区别。

package com.example.lxrent.myapplication

import android.content.Context
import android.support.v7.widget.RecyclerView
import android.util.Log
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView

/**
 *
 *  Created by ldf on 2017/10/9 下午5:44.
 *
 *  God love people
 *
 *  description:
 */
class MyAdapter(context: Context, list: ArrayList<String>) : RecyclerView.Adapter<MyAdapter.MyHolder>() {
    var list: ArrayList<String>? = null
    var inflater: LayoutInflater? = null
    var context: Context? = null

    init {
        this.list = list
        this.inflater = LayoutInflater.from(context)
        this.context = context
    }

    override fun getItemCount(): Int {
        return list?.size ?:0
    }

    override fun onBindViewHolder(holder: MyHolder?, position: Int) {
        holder?.text?.text = list?.get(position)
        Log.d("main", list?.get(position))

    }

    override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): MyHolder {
        return MyHolder(inflater?.inflate(R.layout.item, parent, false), context!!)
    }


    class MyHolder(itemView: View?, context: Context) : RecyclerView.ViewHolder(itemView) {
        //        var text: TextView = itemView?.findViewById(R.id.tv) as TextView
        var text = itemView?.findViewById<TextView>(R.id.tv)
    }

}

上面主要有一个点需要注意,就是holder的写法,以前的写法主要是上面注释的那一句,但是升级了新的kotlin之后出现了问题,一直报错,网上查找资料显示是右侧无法推断出左侧,所以需要使用到泛型,感兴趣的同学可以好好研究研究。

下面使用就非常简单了,不多说直接上代码啦:

package com.example.lxrent.myapplication

import android.os.Bundle
import android.support.v7.app.AppCompatActivity
import android.support.v7.widget.LinearLayoutManager
import android.util.Log
import kotlinx.android.synthetic.main.activity_main.*
import java.util.*


class MainActivity : AppCompatActivity() {
    var list = ArrayList<String>()
    lateinit var myAdapter: MyAdapter
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        initData()

        recyclerView.layoutManager = LinearLayoutManager(this)

        recyclerView.addItemDecoration(MyDividerItemDecoration(
                this, LinearLayoutManager.HORIZONTAL))
        //初始化adapter
        myAdapter = MyAdapter(this, list)

        recyclerView.adapter = myAdapter
    }

    fun initData() {
        //初始化数据
        for (x in 0..15){
            list.add("333"+x)
            Log.d("main", list?.get(x))
        }
    }
}

上面一个知识点是,循环的写法,kotlin的写法比java简单很多了,看着还是很清爽的。

以上就是一个简单的列表了,并不涉及到比较难理解东西。

使用Kotlin实现RecyclerView的多种item布局,需要创建多个ViewHolder来适配不同的布局类型。具体步骤如下: ```kotlin // 创建一个通用的ViewHolder类 class BaseViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { // 绑定数据的方法 fun bindData(data: Any) { // 根据不同的数据类型,绑定不同的布局 when (data) { is TypeA -> { // 绑定TypeA布局 } is TypeB -> { // 绑定TypeB布局 } // ... } } } // 创建一个通用的Adapter类 class BaseAdapter(private val dataList: List<Any>) : RecyclerView.Adapter<BaseViewHolder>() { // 根据不同的布局类型,创建不同的ViewHolder override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BaseViewHolder { return when (viewType) { TYPE_A -> { // 创建TypeA布局的ViewHolder } TYPE_B -> { // 创建TypeB布局的ViewHolder } // ... else -> { // 创建默认布局的ViewHolder } } } // 根据不同的数据类型,返回不同的布局类型 override fun getItemViewType(position: Int): Int { return when (dataList[position]) { is TypeA -> TYPE_A is TypeB -> TYPE_B // ... else -> DEFAULT_TYPE } } // 绑定数据到ViewHolder override fun onBindViewHolder(holder: BaseViewHolder, position: Int) { holder.bindData(dataList[position]) } // 返回数据列表的大小 override fun getItemCount(): Int { return dataList.size } companion object { // 定义不同的布局类型 private const val TYPE_A = 0 private const val TYPE_B = 1 // ... private const val DEFAULT_TYPE = -1 } } ``` 在上述代码中,我们创建了一个通用的ViewHolder类和一个通用的Adapter类。ViewHolder类中的bindData方法根据不同的数据类型,绑定不同的布局。Adapter类中的getItemViewType方法根据不同的数据类型,返回不同的布局类型。在onCreateViewHolder方法中,根据不同的布局类型,创建不同的ViewHolder。在onBindViewHolder方法中,将数据绑定到ViewHolder上。最后,在RecyclerView中设置Adapter即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值