1.应用场景:自定义控件接收点击事件,为了提高复用性,把点击后产生的行为交给它所处控制器去做
2.Android中使用的五大步骤:这些内部定义及调用都是在自定义的adapter中去做的,它是受adapter这个第三方去管理
2.1 Listener私有变量声明:private Listener listener
2.2 定义为interface类型:interface Listener{
void onClick(int position);
}
2.3 set方法:public void setListerner(Listerner listener){
this.listerer = listener;
}
2.4 内部调用: xxView.setOnClickListerer(new View.OnClickListener(){
public void conClick(View v){
if(listerer != null){
listener.onClick(position);
}
)
});
2.5 外部实现:adapter.setListener(new xxAdapter.Listener(){});
3.使用原理:正常的类都是自定定义方法,自己去实现,但是为了实现这样一个点击事件的复用需求,就产生了这么一个内部接口listener,可以把它理解为一个特殊的类型,它不可以new出一个对象,但它可以产生成员变量,它指向匿名内部对象,这样它就可以调用它的接口方法,因为方法在外部控制器中的匿名内部对象中实现了,方法是不能作为参数传递的,java中把接口方法包装到匿名内部类对象中,因为控制器中没有给它独立的方法位置,那你就只能龟缩到参数的位置了
4.吐槽:new xxListener(){},这种写法也真是挺奇葩的,设计java的搞出这么一个迷惑性的写法,是让人不要望文生义吗?所以无视不要被带偏,它不是new一个接口对象,它只是这么一个写法,表示new一个实现了该接口的匿名内部对象,该对象是可以用接口变量接收的,接口委托给了匿名对象去实现它的方法,但是与ios比起来,java额外搞出这么一个匿名对象有些绕了,因为你要实质用的就是这么一个代码块而已,只不过它作为了一个参数传递,该代码块完全可以用一个指针去引导传递,ios中用了block,闭包,delegate这些概念去处理,结构很清晰。
5.待议:以后有新的想法再补充!