关闭

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

标签: android listview
744人阅读 评论(0) 收藏 举报

在用键盘或者遥控器操作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();
				}
			}


 

1
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:3331次
    • 积分:69
    • 等级:
    • 排名:千里之外
    • 原创:3篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章存档