Android ListView item 不触发onItemSelectChanged的解决方法

在用键盘或者遥控器操作ListView 时,当ListView中同一个item失去焦点,而又获取焦点,则不会触发onItemSelectChanged,但是此时还要想在onItemSelectChanged做一些操作处理。这时,就要用一些特殊的处理来解决此种需求:

     当ListView获得焦点的时候,设置它的selection为-1,但是如果强设会不起作用的,必须用反射机制来做。当失去焦点的时候可以用设置ListView的Adapter的focusIndex为-1.这样就可以达到无论怎么操作都会触发ListView的onItemSelectChanged方法。代码如下:

 

	public void onFocusChange(View view, boolean focus) {
		if (view.getId() == R.id.ap_list) {
			if (focus) {
				//ListView同一个item失去焦点后获得焦点,此时不会触发onItemSelectChanged方法
				settleUnselected(apListView);
			} else {
				adapter.setFocusIndex(-1);
				adapter.notifyDataSetChanged();
			}
		}

	}*/
	//利用反射机制将获得焦点的view选中标志位设为-1
			public void settleUnselected(View v) {
				try {
					@SuppressWarnings("unchecked")
					Class<ListView> c = (Class<ListView>) Class
							.forName("android.widget.ListView");
					Method[] flds = c.getDeclaredMethods();
					for (Method f : flds) {
								if ("setSelectionInt".equals(f.getName())) {
									f.setAccessible(true);
								f.invoke(v, new Object[] { Integer.valueOf(-1) });
								}
						}

				} catch (ClassNotFoundException e) {
					e.printStackTrace();
				}
				catch (IllegalArgumentException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (IllegalAccessException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				} catch (InvocationTargetException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
			}


 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值