说道点击事件,我想大家不陌生,今天 我们主要介绍的是在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
......
}