我使用ListView setSelection方法有一些麻烦.我正在尝试在横向和纵向之间切换时,将列表视图保持在相同的索引.但是,每次旋转和重新创建活动时,列表将从顶部开始.我使用的代码如下:
@Override public void onSaveInstanceState(Bundle savedInstanceState) { ArrayList<Integer> indices = new ArrayList<Integer>(); for (Integer i : f_checkedMessages) { indices.add(i); } savedInstanceState.putIntegerArrayList("CheckedMessageIndices",indices); savedInstanceState.putInt("ListIndex",f_listView.getFirstVisiblePosition()); } @Override public void onRestoreInstanceState(Bundle savedInstanceState) { ArrayList<Integer> indices = savedInstanceState.getIntegerArrayList("CheckedMessageIndices"); for (Integer i : indices) { f_checkedMessages.add(i); } int listIndex = savedInstanceState.getInt("ListIndex"); f_listView.setSelection(listIndex); }
我使用调试器来验证listIndex是否是正确的值.还应该提到,当更改方向时,检查的列表视图项目会持续存在.我知道setSelected只有在触摸模式下才能选择列表视图项,但文档说这个方法可以使列表视图对齐,而不管是否处于触摸模式.
有人知道为什么这不工作,还是有更好的方法呢?
谢谢,您的帮助非常感谢!
解决方法
如果进一步的帮助,经过几个小时的迷失与这个问题,我设法解决它使用与A-IV相同的例子,一些修改.
首先,在执行runnable之前调用clearFocus()方法是很重要的.
当调用方法setSelection(index)时,具有触摸模式控制器的设备没有视觉效果,但通常会选择该项.因此,有必要调用requestFocusFromTouch()来启用由方法setSelection(index)引起的可视化更改.
调用setSelection(索引)后,调用requestFocus()以使焦点可以查看.
@Override public void onRestoreInstanceState(Bundle savedInstanceState) { ... final int listIndex = savedInstanceState.getInt("ListIndex"); f_listView.clearFocus(); f_listView.post(new Runnable() { @Override public void run() { listView.requestFocusFromTouch(); listView.setSelection(listIndex); listView.requestFocus(); } });
}
我希望我帮忙!