java中的接口回调比较简单,但是很重要,也很实用。它经常运用于各种adapter中,可以监听adapter中的点击事件,也运用于很多其他的需要监听某些事件的场合。
稍微举一个小例子,展示一下接口回调在adapter中的应用。
1)先定义一个接口
public interface OnItemClickListener {
void onItemClick(int position,View view);
}
2)activity实现这个接口,并覆写其中的方法(用于处理点击事件)
public class CallbackActivity extends Activity implements OnItemClickListener {
private ListView mListView;
private CallbackAdapter mCallbackAdapter;
private ArrayList<String> mArrayList = new ArrayList<>();
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_call_back);
mArrayList.add("harry");
mArrayList.add("mike");
mArrayList.add("lucy");
mListView = (ListView) findViewById(R.id.lsv);
mCallbackAdapter = new CallbackAdapter(CallbackActivity.this, mArrayList, CallbackActivity.this);
mListView.setAdapter(mCallbackAdapter);
}
@Override
public void onItemClick(int position, View view) {
Toast.makeText(CallbackActivity.this, "点击了第 " + position + " 项", Toast.LENGTH_SHORT).show();
}
}
写得随意了点,领会要旨即可。
3)adapter中使用接口对象
public class CallbackAdapter extends BaseAdapter {
private Context mContext;
private ArrayList<String> mList;
private LayoutInflater mLayoutInflater;
private OnItemClickListener mOnItemClickListener;
public CallbackAdapter(Context context, ArrayList<String> list, OnItemClickListener onItemClickListener) {
this.mContext = context;
this.mList = list;
this.mOnItemClickListener = onItemClickListener;
this.mLayoutInflater = LayoutInflater.from(context);
}
public final class ViewHolder {
TextView mTittle;
}
@Override
public int getCount() {
return mList.size();
}
@Override
public Object getItem(int i) {
return mList.get(i);
}
@Override
public long getItemId(int i) {
return i;
}
@Override
public View getView(final int position, View convertView, ViewGroup viewGroup) {
final ViewHolder viewHolder;
if (convertView == null) {
viewHolder = new ViewHolder();
convertView = mLayoutInflater.inflate(R.layout.item_callback, null);
viewHolder.mTittle = (TextView) convertView.findViewById(R.id.tv_tittle);
convertView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) convertView.getTag();
}
viewHolder.mTittle.setText(mList.get(position));
viewHolder.mTittle.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
mOnItemClickListener.onItemClick(position,view);
}
});
return convertView;
}
}
总结:接口回调的机制与回调函数的机制类似:
(1)定义一个接口;
(2)提供接口实现的一方在初始化的时候,将接口回调的引用注册给调用者;
(3)条件发生时,调用者使用引用调用实现的接口方法对事件进行处理。