简述
一般来讲,我们经常会遇到一种情况,在某个时机发生之后,才会执行后续代码,这个时机比如说:点击一个控件、联网请求之后,它们的特点是你不知道用户会在什么时候触发它或者它完成之后的具体时间,一般都不在同一类中,这里就要用到接口回调
简单讲:注册-》有结果了发送事件-》回调方法
简单来讲
准备一个接口:
public interface FirstInterface {
void sendData(int i);
}
自己定义了一个工具类
public class LoginTestUtil {
public static void login(FirstInterface mFirstInterface){
mFirstInterface.sendData(3);//接口里面定义的方法
}
}
在activity中
public void btn_interface(View view) {
LoginTestUtil.login(new FirstInterface() {
@Override
public void sendData(int i) {
Log.d("test","得到的值是:"+i);//就会把值告诉这里,走这个回调方法。
}
});
这里new FirstInterface就是注册,注册自己的接口,当 mFirstInterface.sendData(3),调用自己的方法,并且告诉具体的值,那么就表示有结果了,
}
上述代码就简单完成了接口回调,这里进行的是传值操作。
通过Adapter和RecyclerView来理解
首先准备一个接口
public interface AdapterTellCatalogue {
public void sendClickId(int position);
}
在Adapter中
/**先持有这个接口对象*/
private AdapterTellCatalogue mAdapterTellCatalogue;
/**对外提供公共的访问方法*/
public void setAdapterTellCatalogue(AdapterTellCatalogue adapterTellCatalogue) {
mAdapterTellCatalogue = adapterTellCatalogue;
}
//接下来就是在ReyclerView中设置点击
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mAdapterTellCatalogue.sendClickId(getLayoutPosition());
//通过接口对象,调用接口里的方法
}
});
在RecyclerView所在的类中
private RecyclerViewCatalogueAdapter mRecyclerViewCatalogueAdapter;//Adapter对象
mRecyclerViewCatalogueAdapter.setAdapterTellCatalogue(new AdapterTellCatalogue() {
@Override
public void sendClickId( int position) {
//得到id和position
}
});
总结:
通过上述方法,实现了,用户点击RecyclerView的条目,相应的就会把item的位置发送到ReyclerView的类中。
需求:从Adapter —-》RecyclerView所在类中传值
Adapter准备好接口,以及对外的方法,但是并不实例化,以及当某些时机发生时(点击item),所进行的操作。
在RecyclerView类中,通过Adapter对象调用自己的对外方法,来完成传值
可以理解为:Adapter类中接口不实例化,当某些时机发生时,就会找这个接口实例化的地方。另外,注意的是,在调用Adapter中对外的方法时候,保证操作的是同一个对象(经过测试,如过RecyclerView类中步调用对外方法,那么就会空指针)
通过Activity和它挂载的Fragment
准备一个接口
为了实现从Activity向fragment传值,这里的传值,是在Fragment界面已经成形的基础上,可见可交互了。
public interface StudentVideoStudySend {
public void sendData(boolean isTrue);
}
在Activity中
private StudentVideoStudySend mSendSend;
//对外提供公共的访问方法
public void setStudentVideoStudySend(StudentVideoStudySend sendSend) {
this.mSendSend = sendSend;
}
//这里是完成一个联网请求之后,告诉Fragment,在请求知道之后调用下面那句话
mSendSend.sendData(true);
在挂载的Fragment中
首先保证是同一个Activity
private StudentVideoStudy mStudentVideoStudy;
..
mStudentVideoStudy= (StudentVideoStudy) getActivity();
//这样可以保证得到是同一个Activity
mStudentVideoStudy.setStudentVideoStudySend(new StudentVideoStudySend() {
@Override
public void sendData(boolean isTrue) {
//在这里得到Activity传过来的值
}
}
});
结论
从上述两个例子来看,接口回调应用还是比较多,从字面上看
需要一个接口
需要在外界完成这个接口的实例化
将“触发”与“应对”分开