Android spinner點擊相同選項處理無法響應事件問題,暴力反射

最近寫項目用到了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,達到我們的目的了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章