发现你最近也有提Android相关的问题,那我就通过Android ListView item的点击事件,一种使用频率很高的view,通过它认识“回调”,可能有助于理解。
比如ListView包含几个概略信息条目,你想点击某个条目跳到详情界面。
一般需要这样做:
mListView.setOnItemClickListener(mOnItemClickListener);
private OnItemClickListener mOnItemClickListener = new OnItemClickListener() {
@Override
public void onItemClick(AdapterView> parent, View view, int position, long id) {
Intent intent = new Intent(getActivity(), DetailActivity.class);
intent.putExtra(DetailActivity.ITEM_ID, position);
startActivity(intent);
}
};
当你这样做时,就已经实现了一个回调(implements a callback interface)。
接下来发生的事情我们就知道了,点某个条目就跳到其详情界面。
问题是,谁去调(call)它呢?我们在实现(implements)这个回调时,为什么必须要override其中的方法呢?
为了厘清这个问题,我们从点击事件发生时执行的代码看起:
// AdapterView.class, 这是ListView父类的父类
// 当view被点到时,performItemClick就被调到,处理点击带给view的变化,除此之外,
// AdapterView还想到了,“如果其它类想在点击发生时做点儿事情,该怎么办呢?”
// 通过接口。
// (1)我来定义接口,把知道的信息(被点到的view、position、id)告诉你;
// (2)你来实现接口,然后把实现的接口告诉我。
// 呐,这是我定义的接口。
255 public interface OnItemClickListener {
270 void onItemClick(AdapterView> parent, View view, int position, long id);
271 }
// 呐,你通过这个方法把实现的接口告诉我,我会存起来的。
279 public void setOnItemClickListener(OnItemClickListener listener) {
280 mOnItemClickListener = listener;
281 }
134 OnItemClickListener mOnItemClickListener;
// 那么现在点击事件发生了:
302 public boolean performItemClick(View view, int position, long id) {
// 我先检查你是否实现了接口;
303 if (mOnItemClickListener != null) {
// 嘿,该你回来做事情了。这就是callback,我call,你back。
305 mOnItemClickListener.onItemClick(this, view, position, id);
309 return true;
310 }
312 return false;
313 }
这是callback一种典型的应用场景。Android中有很多OnClickListener使用场景,看多了之后才对callback有些粗浅的认识,以前也是糊里糊涂的。
还有其它一些注册接口的形式,比如:register***Callbacks, unregister***Callbacks, remove***Callbacks。
就是这样 :)