回调函数这一设计允许了底层代码调用在高层定义的子程序
比如我们有一个listview,用一个adapter来绘制listview里的item。在adapter类里面,如果我们需要在一个button被点击时调用到listview.forcelayout()函数,本来是没有办法的,因为adapter访问不到调用他的listview,此时就可以在adapter中写一个接口
public abstract void onClick() ;
}
在adapter里声明
private onClickItemListener onClickItemListener;
并为它写一个setonClickItemListener
函数
this.onClickItemListener = onClickItemListener ;
}
并在button的onclick里实例化
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
onClickItemListener.onClick();
}
}
这样当点击按钮时就会调用我们声明的接口里的onClick方法了。
接下来要做的就是在外部的listview里实现这个方法。
adapter.setonClickItemListener ( new onClickItemListener {
@Override
public void onClick(){
listview.forcelayout();
}
})
这样在绘制listview的过程,listview先调用adapter,adapter在触发click事件时会运行我们声明的接口的onClick函数,而这个函数在listview中被定义,于是又回调到调用adapter的listview中。这就诠释了回调的定义和全过程。
有没有注意到我们这个回调函数的写法与button的onClick很相似,实际上button的点击事件就是最典型的回调了。