分析
在Android开发中难免会使用到Spinner控件,而且经常会对其绑定点击事件。下面就从源码上来解析下为什么Spinner不对同一item二次点击进行事件响应。
我们从Spinner的事件入手,我们来看以下几个事件绑定,首先是Spinner本身的
/**
* <p>A spinner does not support item click events. Calling this method
* will raise an exception.</p>
* <p>Instead use {@link AdapterView#setOnItemSelectedListener}.
*
* @param l this listener will be ignored
*/
@Override
public void setOnItemClickListener(OnItemClickListener l) {
throw new RuntimeException("setOnItemClickListener cannot be used with a spinner.");
}
好吧,显然 这个方法是无用的。再看Spinner的父类AbsSpinner发现其中并没有关于事件绑定的方法,继续往上找AbsSpinner的父类AdapterView,我们可以发现以下几个与点击事件相关的方法:
- setOnClickListener(View.OnClickListener l)
- setOnItemClickListener(AdapterView.OnItemClickListener listener)
- setOnItemLongClickListener(AdapterView.OnItemLongClickListener listener)
setOnItemSelectedListener(AdapterView.OnItemSelectedListener listener)
由于Spinner本身override了setOnItemClickListener()方法 所以这个略过,那么剩下的
@Override
public void setOnClickListener(OnClickListener l) {
throw new RuntimeException("Don't call setOnClickListener for an AdapterView. "
+ "You probably want setOnItemClickListener instead");
}
setOnClickListener()这个也不用看了,继续
/**
* Register a callback to be invoked when an item in this AdapterView has
* been clicked and held
*
* @param listener The callback that will run
*/
public void setOnItemLongClickListener(OnItemLongClickListener listener) {
if (!isLongClickable()) {
setLongClickable(true);
}
mOnItemLongClickListener = listener;
}
这个顾名思义长点击事件,这个不符合我们使用情况,最后只剩下一个方法也是我们平时用的
/**
* Register a callback to be invoked when an item in this AdapterView has
* been selected.
*
* @param listener The callback that will run