Spinner控件可以监听,但是监听的话,如果两次点击都是同一个item的话,那么就就不会触发,因为看源码的话就会发现,在Spinner中有一个保存上次点击的位置的变量叫做
mOldSelectedPosition的变量,每次点击的时候就会验证两次点击是否是同一个item,不同就触发点击事件,因此可以修改mOldSelectedPosition变量,让控件两次点击相同都可以触发。但是私有变量也可以改变他的值,就是使用java的反射来做。
以下就是源码部分:
void checkSelectionChanged() {方法 checkSelectionChanged 和变量 mOldSelectedPosition 都是 AdapterView 私有的,我们无法继承 Spinner 重写之。不过,利用 java 的反射,我们可以暴力修改 mOldSelectedPosition 的值:
if ((mSelectedPosition != mOldSelectedPosition) || (mSelectedRowId != mOldSelectedRowId)) {
selectionChanged();
mOldSelectedPosition = mSelectedPosition;
mOldSelectedRowId = mSelectedRowId;
}
}
new OnItemSelectedListener() {
@Override
public void onItemSelected(AdapterView<?> arg0, View arg1,
int arg2, long arg3) {
// TODO Auto-generated method stub
try {
//以下三行代码是解决问题所在
Field field = AdapterView.class.getDeclaredField("mOldSelectedPosition");
field.setAccessible(true);//设置mOldSelectedPosition可访问
field.setInt(spinner, AdapterView.INVALID_POSITION); //设置mOldSelectedPosition的值
} catch (Exception e) {
e.printStackTrace();
}
}
@Override
public void onNothingSelected(AdapterView<?> arg0) {
// TODO Auto-generated method stub
}
};