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

来源:互联网 发布:mac os 支持ntfs 编辑:程序博客网 时间:2024/05/16 05:05

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

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

 button.setOnClickListener {      val user = User("name")      user.id = "100"      SecondActivity.startActivity(this,user)    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 1
  • 2
  • 3
  • 4
  • 5

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

button.setOnClickListener {      view-> toast(view.id.toString())    }
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

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

button.setOnClickListener(new OnClickListener(){    @Override    public void onClick(View view){        toast(view.id.toString())       }})
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

从以上栗子可以看出,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) {  }}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

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

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


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

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

可以改为

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

2.在头部导入

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

这样就可以免去万恶的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) }    }  }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

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

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

接下来给个set函数

fun setOnItemClickListener(listener: ((pos: Int) -> Unit)){    mListener = listener  }
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

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

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

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

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

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

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