zoukankan      html  css  js  c++  java
  • 使用反射让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,达到我们的目的了。

     

    通过代码实现Spinner的选中事件:

    spinner.performItemClick(subOrdersListView.getChildAt(orderMenuPosition), orderMenuPosition,
      subOrdersListView.getItemIdAtPosition(orderMenuPosition));

  • 相关阅读:
    [ZZ]asp.net页面生命周期
    [ZZ]关于内存中栈和堆的区别
    我的第一个ASP.NET网页
    服务应用之WEB与WCF使用之见
    WEB服务于WCF服务的技术资料
    常用的Web服务和WCF服务
    笔试面试,几个字解决(原创)
    beij~~~
    Symbian 逐步深入(三)
    More 平台
  • 原文地址:https://www.cnblogs.com/diyishijian/p/4877860.html
Copyright © 2011-2022 走看看