使用反射让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));

时间: 2024-08-03 00:38:03

使用反射让Spinner选择同一选项时触发onItemSelected事件的相关文章

jQuery和dom页面加载完成时触发的事件

1 <!DOCTYPE html> 2 <html> 3 <head> 4 <meta charset="UTF-8"> 5 <title>Insert title here</title> 6 <script type="text/javascript" src="js/jquery-1.8.3.js"></script> 7 <script

解决上传文件或图片时选择相同文件无法触发change事件的问题

昨天在做一个上传文件的模块时遇到了这样的问题:打开文件一上传,上传成功后再次点击文件一,change事件无反应 <input type="file" name="file" class="file-input" @change="setFile" /> 在网上查了一番发现,当第一次选择文件一上传时,存放的文件由空变成了文件一,上传成功后,再次选择文件一,此时就相当于没有change,所以两次选择相同的文件不会触发c

解决input file两次选择相同文件不触发change事件的问题

当第一次选择图片1时,input的change事件触发,因为input的value从无变成图片1,value值发生了改变, 此时: 如果第二次选择图片2时,input的change事件触发,因为input的value从图片1变成图片2,value值发生了改变, 如果第二次选择图片1时,input的change事件不会触发,因为input的value值依然为图片1,value值没有发生改变,如果第二次不做文件选择,而是点击的取消的话,change事件触发,因为value值被清空, 我的解决方案是i

elementUI 下拉框隐藏时触发相关事件(下拉框下拉显示时不触发)

原文:https://blog.csdn.net/CarryBest/article/details/79959389 今天做项目时,用elementUI框架,需要下拉框隐藏时出发某个函数,用了visible-change这个函数,发现点击时会触发两次我自己定义的函数,看了下官网的解释 :下拉框出现/隐藏时触发   如果只想在下拉框隐藏时触发该怎么做呢?下面是解决办法:官网定义:Select Events @visible-change 函数里面传递两个参数(第一个为回调参数,第二个为自己定义的

input中的内容改变时触发的事件

onchange事件在内容改变(两次内容有可能相等)且失去焦点时触发: onpropertychange事件是实时触发,每增加或删除一个字符就会触发,通过js改变也会触发该事件,但是该事件是IE专有. oninput事件是IE之外的大多数浏览器支持的事件,在value改变时实时触发,但是通过js改变value时不会触发:基本写原生常用的是oninput. oninput与onpropertychange失效的情况: oninput事件: 1.当脚本中改变value时,不会触发: 2.从浏览器的自

onpopstate浏览器点击回退按钮时触发的事件

知识点: 1.onpopstate事件,点击后退按钮(或者在JavaScript中调用history.back()方法)时触发: 2.hash 属性:可对URL的锚部分(从 # 号开始的部分)进行操作(可读可写): 关于hash的链接点击打开链接 需求: 微信页面,在当前页面点击某处时,弹出一个覆盖整个手机屏幕的层,弹出这个层以后,点击微信屏幕的返回按钮时,隐藏弹出层,而不退出当前页面! 解决方案: 在点击事件发生的时候利用hash属性给URL加上锚点,展示弹出层,而点击返回按钮后,去掉URL锚

winform datagridview中combobox列改变选项时触发其他列变化

之前想使用DataGridView的SelectionChanged事件,但是使用了后并没有达到效果 最后使用下面的方式实现: private void materialCheckGridView_EditingControlShowing(object sender, DataGridViewEditingControlShowingEventArgs e) { int cidx = materialCheckGridView.CurrentCell.ColumnIndex; if (mate

进入网页开始计时,关闭页面时触发操作事件

<html> <head> <title>页面停留时间</title> </head> <body onload="init(); window.setTimeout('show_secs()',1);" > <script language="javascript"> var ap_name = navigator.appName; var ap_vinfo = navigator

JS 对输入判断变化屏蔽中文输入法连续输入时触发的事件

//智能搜索提示 IntelligenceSearch: function IntelligenceSearch() { $('#keyWord').on('input', function () { if ($(this).prop('comStart')) return; // 中文输入过程中不截断 var url = $('#hKeyWord').val(); var data = { keyword: $('#keyWord').val() }; $('#words').html('')