学习的步伐(二)Kotlin 实现Recyclerview列表(补充:tab选项卡+CoordinatorLayout收缩布局+复杂Recyclerview列表)

来源:互联网 发布:舰娘本子 知乎 编辑:程序博客网 时间:2024/06/05 08:34

一日之计在于晨,来一发!

补充功能:效果图

这里写图片描述

demo源码 tab选项卡+CoordinatorLayout收缩布局+复杂Recyclerview列表


  • 学习的步伐(六) Kotlin 学习总结:类的特性

  • 学习的步伐(五) Kotlin 基础语法学习总结:语法

  • 学习的步伐(四) Kotlin 基础语法学习总结:操作符

  • 学习的步伐(三)Kotlin TabLayout+Viewpager+Fragment实现基础框架

概述

本文主要kotlin实现一个recyclerview列表,item的点击事件。
demo早就写好了,但是时间久了还是会忘的。还是要经常复习的,不是有个记忆曲线吗,所以本文是我复习用的,俗话说好记性不如烂笔头吗!


配置

app的build.gradle

    apply plugin: 'kotlin-android'    apply plugin:'kotlin-android-extensions'    apply plugin: 'android-apt'    compile "org.jetbrains.kotlin:kotlin-stdlib-jre7:$kotlin_version"    compile 'org.jetbrains.anko:anko:0.10.0'

project的build.gradle

    buildscript {    ext.kotlin_version = '1.1.2-5'  //版本号    repositories {        jcenter()    }    dependencies {        classpath 'com.android.tools.build:gradle:2.2.2'        //配置        classpath 'com.neenbedankt.gradle.plugins:android-apt:1.8'        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"        // NOTE: Do not place your application dependencies here; they belong        // in the individual module build.gradle files    }}

Kotlin 基础介绍

这里只是本文用到的基础。个人感觉学习一门新语言,还是去写一些demo或项目,是学的比较深刻的。很多东西但看语法,忘得特别快的(反正我是这样的),在特定的情景下学习是最快的,记忆最深的。

  • var 和val
var是变量   val是常量
  • ? 表示可以为空
但也根据具体的场景来确定它所表达的意思。例如适配器中的: holder?.txtName?.text=list.get(position)就像上面所说的?标识可以为空,但是这里的意思确实空检测,可以更安全调用(意思是不为空的情况下才会执行完这句代码,中间有一个为空就直接返回空了)
  • !! 第三个选择是 NPE-lovers。我们可以用 b!! ,这会返回一个非空的 b 或者抛出一个 b 为空的 NPE
//recyclerview适配器  hodler里 //这里需要从前面一个一个写  直接写itemView.调用是不行的        var txtName: TextView = itemView!!.findViewById(R.id.text_kotlin) as TextView;
  • : : 利用反射
//开启一个activity  var intent=Intent()        //:: 利用反射  intent.setClass(this,Main2Activity::class.java)  startActivity(intent)
  • 函数 返回一个Arraylist集合
 /**     * 制造假数据     * 返回一个ArrayList<String> 的集合     * */    fun getData( ) : ArrayList<String>{        val arrayList = ArrayList<String>()        val list = listOf<String>("a", "b", "c", "d", "e", "f", "g", "h", "j", "k", "l", "m", "n", "o")        //for循环        for (k in list){            arrayList.add(k)        }        return  arrayList    }
  • for循环
  //for循环        for (k in list){            arrayList.add(k)        }
  • Log打印和Toast
        var a : Int=2//var 变量  val常量        var b : String="这是一个学习Kotlin的机会"        Log.e("MainActivity","a=>>>${a}______b=>>>${b}")//Log打印        toast("a=>>>${b}")//

实现Recyclerview列表

android原生去实现大家都会写,这里只说以下kotlin实现跟android原生实现的不同。

  • 注意:
 //这行代码  是帮你找到布局中所有的控件 //可以使用快捷键导入的import kotlinx.android.synthetic.main.activity_main.*
  • 设置列表的样式和适配器
//原生方式:linearLayoutManager = new LinearLayoutManager(getActivity());mRec.setLayoutManager(linearLayoutManager);adapter = new OnlineRedAreaListAdapter(getActivity(), redAreaList, this);mRec.setAdapter(adapter);
//kotlin方式  val adapter = KotlinRecAdapter(this, getData()!!)  recyclerview.layoutManager=LinearLayoutManager(this)  recyclerview.adapter=adapter;  //是不是眼前一亮的感觉  //getData()!! 表示非空

getData():

 /**     * 制造假数据     * 返回一个ArrayList<String> 的集合     * */    fun getData( ) : ArrayList<String>{        val arrayList = ArrayList<String>()        val list = listOf<String>("a", "b", "c", "d", "e", "f", "g", "h", "j", "k", "l", "m", "n", "o","p")        //for循环        for (k in list){            arrayList.add(k)        }        return  arrayList    }
  • 适配器的编写

传参

 //传数据 val adapter = KotlinRecAdapter(this, getData()!!)

KotlinRecAdapter

class KotlinRecAdapter(mCtx:Context,mList:ArrayList<String>) :RecyclerView.Adapter<KotlinRecAdapter.MHolder>(){    //可以把数据直接放到类名后面,然后用变量接收    private var context:Context = mCtx    private var list:ArrayList<String> = mList

ViewHolder也有多种写法:

    /**     * 第一种写法     * 使用快捷键的话默认使用的是第一种     * ?表示可以为空     * !! 第三个选择是 NPE-lovers。我们可以用 b!! ,这会返回一个非空的 b 或者抛出一个 b 为空的 NPE     * */    class MHolder(itemView: View?) : RecyclerView.ViewHolder(itemView) {        //这里需要从前面一个一个写  直接写itemView.调用是不行的        var txtName: TextView = itemView!!.findViewById(R.id.text_kotlin) as TextView;        var linearlayout: LinearLayout = itemView!!.findViewById(R.id.linearlayout) as LinearLayout;    }
 /**     * 第二种写法     * */class MHolder: RecyclerView.ViewHolder {    constructor(view : View) : super(view){    }}

重写Recyclerview的适配器里的方法:

 override fun onBindViewHolder(holder: MHolder?, position: Int) {        // holder?.txtName?  都必须加个?号才可以调用  ?表示可以为空        holder?.txtName?.text=list.get(position)        holder?.linearlayout?.setOnClickListener {        //item点击事件            litener?.onItemClick(position)        }    }    override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): MHolder {        return MHolder(LayoutInflater.from(context).inflate(R.layout.kotlin_item,parent,false))    }    override fun getItemCount(): Int {        return list.size    }

item点击事件的自定义接口

 /**     * 自定义接口处理点击事件     * 跟java的写法基本一致     * */    interface OnItemClickLitener {            fun onItemClick(position : Int)    }    var litener:OnItemClickLitener? =null    fun setOniteClickListener(litener : OnItemClickLitener ){            this.litener=litener    }
  • 奉上适配器的整体代码:
class KotlinRecAdapter(mCtx:Context,mList:ArrayList<String>) :RecyclerView.Adapter<KotlinRecAdapter.MHolder>(){    //可以把数据直接放到类名后面,然后用变量接收    private var context:Context = mCtx    private var list:ArrayList<String> = mList    override fun onBindViewHolder(holder: MHolder?, position: Int) {        // holder?.txtName?  都必须加个?号才可以调用  ?表示可以为空        holder?.txtName?.text=list.get(position)        holder?.linearlayout?.setOnClickListener {            litener?.onItemClick(position)        }    }    override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): MHolder {        return MHolder(LayoutInflater.from(context).inflate(R.layout.kotlin_item,parent,false))    }    override fun getItemCount(): Int {        return list.size    }    /**     * 第一种写法     * 使用快捷键的话默认使用的是第一种     * ?表示可以为空     * !! 第三个选择是 NPE-lovers。我们可以用 b!! ,这会返回一个非空的 b 或者抛出一个 b 为空的 NPE     * */    class MHolder(itemView: View?) : RecyclerView.ViewHolder(itemView) {        //这里需要从前面一个一个写  直接写itemView.调用是不行的        var txtName: TextView = itemView!!.findViewById(R.id.text_kotlin) as TextView;        var linearlayout: LinearLayout = itemView!!.findViewById(R.id.linearlayout) as LinearLayout;    }    /**     * 第二种写法     * *///class MHolder: RecyclerView.ViewHolder {//    constructor(view : View) : super(view){////    }//    }    /**     * 自定义接口处理点击事件     * 跟java的写法基本一致     * */    interface OnItemClickLitener {            fun onItemClick(position : Int)    }    var litener:OnItemClickLitener? =null    fun setOniteClickListener(litener : OnItemClickLitener ){            this.litener=litener    }}

activity实现接口的方式也变了

class MainActivity : AppCompatActivity() ,KotlinRecAdapter.OnItemClickLitener{    override fun onItemClick(position: Int) {    }

intent传递数据

//跟java  类似,只是开启activity的方式变了    var intent=Intent()        //:: 利用反射        intent.setClass(this,Main2Activity::class.java)        intent.putExtra("position",""+position)        startActivity(intent)

到这里整个功能就实现了!


demo下载地址

每天学习那么一点,积少成多。总会有回报的,俗话说的话,滴水穿石!

阅读全文
1 0
原创粉丝点击