android – setSelection不改变ListView的位置

我使用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();
    }
});

}

我希望我帮忙!

相关文章

Android性能优化——之控件的优化 前面讲了图像的优化,接下...
前言 上一篇已经讲了如何实现textView中粗字体效果,里面主要...
最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个...
WebView加载页面的两种方式 一、加载网络页面 加载网络页面,...
给APP全局设置字体主要分为两个方面来介绍 一、给原生界面设...
前言 最近UI大牛出了一版新的效果图,按照IOS的效果做的,页...