我在使用ListView setSelection方法时遇到了一些麻烦。在横向和纵向之间切换时,我试图使列表 View 保持相同的索引。但是,每次旋转并重新创建 Activity 时,列表 View 都从顶部开始。我使用的代码如下:
@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是正确的值。还应该提到的是,更改方向时,选中的列表 View 项仍然存在。我知道setSelected仅在触摸模式下才选择listview项,但是文档说此方法将使listview对齐,而不管是否在触摸模式下。
有谁知道为什么这不起作用,或者是否有更好的方法来解决这个问题?
谢谢,非常感谢您的帮助!
最佳答案
如果需要进一步的帮助,则在此问题浪费了几个小时之后,我设法使用相同的A-IV示例并进行了一些修改来解决了该问题。
首先,在执行可运行对象之前必须先调用clearFocus()方法。
当调用setSelection(index)方法时,具有与触摸模式 Controller 相同功能的设备没有视觉效果,但是通常会选择该项目。因此,有必要调用requestFocusFromTouch()来启用由setSelection(index)方法引起的视觉变化。
调用setSelection(index)之后,请调用requestFocus()以便将焦点移到 View 上。
@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();
}
});
}
希望我能帮上忙!
关于android - setSelection不更改ListView位置,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7018921/