让你的代码减少三倍!使用kotlin开发Android(五) 监听器

原创 2016年11月01日 18:07:05

本文同步自 博主的私人博客wing的地方酒馆

在前面的博客中,有一个栗子,是点击按钮转跳的监听器。

 button.setOnClickListener {
      val user = User("name")
      user.id = "100"
      SecondActivity.startActivity(this,user)
    }

可以看到,不用再new一个OnClickListener了。实际上这种写法是lambda的一种简略模式,通常情况下匿名内部类可以以如下表现形式展示:

button.setOnClickListener {
      view-> toast(view.id.toString())
    }

简单来说就是->左边为参数,右面为结果。其过程相当于


button.setOnClickListener(new OnClickListener(){
    @Override
    public void onClick(View view){
        toast(view.id.toString())   
    }
})

从以上栗子可以看出,lambda可以极大简化我们的代码。当左面参数没有使用到的时候,可以省略掉整个左半部分”view->”,就如同第一个代码片一样。

给RecyclerView加监听

在MainActivity里添加一个RecyclerView。并且新建一个适配器起名MainAdapter


import kotlinx.android.synthetic.main.item_main.view.*

class MainAdapter: RecyclerView.Adapter<MainAdapter.ViewHolder>() {
  override fun onBindViewHolder(holder: ViewHolder?, position: Int) {

  //改变作用域,with{}都是属于itemView
    with(holder?.itemView!!){
            tv_content.text = "第 $position 条数据"
    }
  }

  override fun getItemCount(): Int {
      return 5
  }

  override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): ViewHolder {
    return ViewHolder(View.inflate(parent?.context, R.layout.item_main,null))
  }


  class ViewHolder(itemView: View?) : RecyclerView.ViewHolder(itemView) {

  }
}

像往常一样写一个RecyclerView的布局

注意这个适配器里使用的一些小技巧


1.with改变作用域,如果你有一大堆需要重复写的前缀,则可以使用with改变作用域。如:

mBinding?.tvName?.text = "张三"
mBinding?.tvContent?.text = "张三跟李四有py交易"
mBinding?.ivIcon.resouce = R.drawable.icon

可以改为

with(mBinding){
    tvName?.text = "张三"
    tvContent?.text = "张三跟李四有py交易"
    ivIcon.resouce = R.drawable.icon
}

2.在头部导入

import kotlinx.android.synthetic.main.item_main.view.*

这样就可以免去万恶的findviewbyid


3.View.infalte()代替LayoutInfalter.form().infalte()

这个没啥好说的,省点代码而已~~


4.String模板输出,类似于C语言的print

添加监听器

大家都知道,有个简便的方法就是直接给itemView添加个OnClickListener()~

所以在onBindViewHolder()开刀,注意写法,这里与java有不同

class MainAdapter : RecyclerView.Adapter<MainAdapter.ViewHolder>() {
  var mListener: ((pos: Int) -> Unit)? = null

  fun setOnItemClickListener(listener: ((pos: Int) -> Unit)){
    mListener = listener
  }
  override fun onBindViewHolder(holder: ViewHolder?, position: Int) {
    with(holder?.itemView!!) {
      tv_content.text = "第 $position 条数据"
      setOnClickListener { mListener?.invoke(position) }
    }
  }

其中给了一个函数变量mListener, 他的输入为int,返回值为Unit(kotlin的null,不过是个具体的对象)

var mListener: ((pos: Int) -> Unit)? = null

接下来给个set函数

fun setOnItemClickListener(listener: ((pos: Int) -> Unit)){
    mListener = listener
  }

这样就完成了item监听器的编写,所以我们的Activity代码如下:

    val adapter = MainAdapter()
    recyclerView.adapter = adapter
    recyclerView.layoutManager = LinearLayoutManager(this)
    adapter.setOnItemClickListener { pos->toast("$pos") }

本文这就结束了(嫌文字太短?不要急啦,先去动手实践下咯。。系列文章,既然挖了坑,就不会拖更的(吧..))

如果你是Android开发者,那么你还可以来 wing的酒馆:425983695来分享你的开发经验哦

一个使用Kotlin开发的完整项目地址

版权声明:本文为博主原创文章,欢迎注明出处后转载。

Kotlin 实现按钮点击跳转监听事件

例子:首页Guiding页面点击按钮跳转到主页面 package com.example.naizu.mavecimport android.app.Activity import android...

Kotlin最简单的入门教程——委托

我感觉委托还是比较重要的,所以还是要看一下,不然后面用到都不知道是什么1 类委托委托模式已经证明是实现继承的一个很好的替代方式, 而 Kotlin 可以零样板代码地原生支持它。 类 Derived 可...

让你的代码减少三倍!使用kotlin开发Android(五) 监听器

本文同步自 博主的私人博客wing的地方酒馆在前面的博客中,有一个栗子,是点击按钮转跳的监听器。 button.setOnClickListener { val user = User("...

kotlin基础

kotlin 语言特性 kotlin中一切皆为对象 没有像java一般的基本数据类型,数值类型为:Int, Float, Double等 函数也是对象,可作为参数和返回值 自然就会有高阶函数和lam...
  • To_yan
  • To_yan
  • 2016年07月14日 02:05
  • 11922

用Kotlin写android点击事件

一、写点击事件的2种方式 1.全局实现接口方式:     a.全局实现View.OnCLickListener后:     b.btn_secacti_first.setOnClickLis...

用Kotlin实现Android点击事件

近期,Google宣布Kotlin成为了Android一级开发语言。于是就刚刚简单的研究了一下,查资料的时候发现现成的资料还是很少的,于是决定自己记录一下,方便以后查看,也供其他人一个参考。 在an...

用Kotlin写android点击事件

一、写点击事件的2种方式1.全局实现接口方式:a.全局实现View.OnCLickListener后:b.btn_secacti_first.setOnClickListener(this) bt...

Kotlin中的并发原语

Concurrency Primitives in Kotlin (Kotlin中的并发原语) 我最近开始阅读G. Blake Meike的“Android Concurrency”,到目前为止,...

轻松掌握Kotlin委托机制

属性的委托属性的委托指的是一个类中的某个属性的值不是在类中直接进行定义,而是由某个类的方法来进行 setter 和 getter。默认属性委托都是线程安全的。属性委托适合那些属性的需要复杂的计算但是计...
  • zxc123e
  • zxc123e
  • 2017年06月28日 11:59
  • 496

Kotlin-对象表达式,对象声明及伴随对象

概述在Java中,不管是为了实现接口,或者是抽象类,我们总是习惯使用匿名内部类。最熟悉的例子,莫过于对单击事件的监听,也就是这样写:btn.setOnClickListener(new OnClick...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:让你的代码减少三倍!使用kotlin开发Android(五) 监听器
举报原因:
原因补充:

(最多只允许输入30个字)