zoukankan      html  css  js  c++  java
  • 让你的代码减少三倍!使用kotlin开发Android(五) 监听器

    本文同步自 博主的私人博客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开发的完整项目地址

  • 相关阅读:
    P6Spy 监控JDBC详细配置说明
    apache mina2.0核心架构
    Window.open
    FLEX做的网站
    采用CSS让DIV在网页中水平垂直居中
    VSFTP成功安装访问被拒绝问题 500 OOPS: cannot change directory:/home/ftp
    SvnServe(1.7)服务器配置
    运行 Flash builder 4.5 弹出对话框 failed to create the java virtual machine 解决方法
    c++中的隐藏、重载、覆盖(重写)
    golang/net/http
  • 原文地址:https://www.cnblogs.com/muyuge/p/6333506.html
Copyright © 2011-2022 走看看