说道点击事件,我想大家不陌生,今天 我们主要介绍的是在RecycView中的点击事件,同时了解Java和kotlin监听事件的不同,如何优雅的看待kotlin的函数式接口

大家一步步来,我们先介绍java的

1,简单View的点击事件

view1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                
            }
        });

源码
从源码上看是一个接口,我们在前台界面回调这个接口,将数据传输过来

/**
     * Interface definition for a callback to be invoked when a view is clicked.
     */
    public interface OnClickListener {
        /**
         * Called when a view has been clicked.
         *
         * @param v The view that was clicked.
         */
        void onClick(View v);
    }

2,简单ListView的Item的点击事件

listview.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                
            }
        });

源码:
从源码的注释里面来看,这个是一个接口表示的是AdapaterView中的一个Item被点击的时候调用

public interface OnItemClickListener {

        /**
         * Callback method to be invoked when an item in this AdapterView has
         * been clicked.
         * <p>
         * Implementers can call getItemAtPosition(position) if they need
         * to access the data associated with the selected item.
         *
         * @param parent The AdapterView where the click happened.
         * @param view The view within the AdapterView that was clicked (this
         *            will be a view provided by the adapter)
         * @param position The position of the view in the adapter.
         * @param id The row id of the item that was clicked.
         */
        void onItemClick(AdapterView<?> parent, View view, int position, long id);
    }

3,RecycView的点击事件

请问读者你想啥呢,RecycleView有点击事件吗,老老实实自己写吧,请往下看

4,RecycView的点击事件Java实现模式

所谓的java实现模式就是定义一个接口,在类里面实现这个接口,在adapter中调用就这个接口,数据就会传输到实现类里面去,好现在开始吧

//接口变量的一个类
var listener:Listener<BEAN>? = null
//定义一个接口
interface Listener<BEAN>
{ 
	fun onClick(data:BEAN)
}
fun setMyListener(listener:Listener<BEAN>){
	this.listener = listener
}

在这里我们需要在前台界面类里面实现这个Listener类,然后在界面上将这个listener传递过来就可以了,也就是还要用一个类将这个接口包裹起来,这样就稍微麻烦一点,等下我们后面介绍kotlin优雅的写法

class MyActivity :Listener<BEAN>{

//实现了接口就要实现接口里面的方法
	override fun onClick(data:BEAN)
	{
	//这里是接收数据的地方
	}
	// 当然在接收数据之前,我们需要要将listener传递过去
	adapter.setMyListener(this)
	//因为这个类实现了Listener接口,当然,传递过去this就可以了
}

5,RecycView的点击事件Kotlin实现模式

kotlin具有函数式编程的能力,因此,在编程方面提供了强大的便捷性
kotlin中函数和类是平等的,可以独立于类的单独存在

//定义一个函数式接口
var listener:((itemBean:ITEMBEAN)->Unit?)? =null
//给函数式接口传值,也就是传递一个函数,至于函数实现什么功能,用户自己定义
fun setMyListener(listener:(itemBean:ITEMBEAN)->Unit){
	this.listener = listener
}

//adapter中调用这个函数,在onBindViewHolder中调用
override fun onBindViewHolder(p0: BaseListAdapter.BaseListHolder, p1: Int) {
....此处省略

//下面就是kotlin调用这个函数,传递数据的过程
itemView.setOnClickListener{
	listener?.let{
		data
	}
	//let表达式表示如果为空就不会执行
	//listener?.invoke(data) 也可以
}

}

在界面中如Activity或者Fragment

adapter.setMyListener{ it

//下面是函数的内容,上面有一个it,默认是不展示的,也可以手动写上去
//这里的it就是返回的数据
it.name
it.age
......

}