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