我在使用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/

10-09 04:22