最近寫項目用到了spinner,要求點擊item 進行跳轉操作,但是當我返回到包含spinner的activity中,再次點擊相同的item無法實現跳轉操作。研究了半天才發現原因,Android spinner本身記住了上一次選擇的項,再次點擊相同的項是不會觸發onitemselected事件的。
看下源碼 發現spinner判斷 是否觸發onitemselected,是在基類adapterView中做的。
void checkSelectionChanged() {
if ((mSelectedPosition != mOldSelectedPosition) || (mSelectedRowId != mOldSelectedRowId)) {
selectionChanged();
mOldSelectedPosition = mSelectedPosition;
mOldSelectedRowId = mSelectedRowId;
}
}
方法checkSelectionChanged和變量mOldSelectedPosition都是AdapterView私有的,我們無法繼承Spinner重寫之。不過,利用java的反射,我們可以暴力修改mOldSelectedPosition的值: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
}
};
我們每次選擇之後,就更改mOldSelectedPosition的值,使得每次mSelectedPosition
!= mOldSelectedPosition判斷總是爲true,那麼總會觸發onItemSelected,達到我們的目的了。