setSelection不更改ListView位置

Chr*_*ris 14 android listview orientation

我在使用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);
}
Run Code Online (Sandbox Code Playgroud)

我使用调试器来验证listIndex是否是正确的值.还应该提到的是,在更改方向时,检查的列表视图项仍然存在.我知道如果处于触摸模式,setSelected仅选择列表视图项,但文档说这个方法将对齐列表视图,无论是否处于触摸模式.

有谁知道为什么这不起作用或者是否有更好的方法来解决这个问题?

谢谢,非常感谢您的帮助!

Tay*_*ldo 34

如果有进一步的帮助,在这个问题丢失几个小时之后,我设法使用相同的A-IV示例解决它,并做了一些修改.

首先,在执行runnable之前调用clearFocus()方法至关重要.

当调用方法setSelection(index)时,具有触摸模式控制器的设备没有视觉效果,但通常会选择该项.因此,有必要调用requestFocusFromTouch()来启用由方法setSelection(index)引起的视觉更改.

在调用setSelection(index)之后,调用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();
    }
});
Run Code Online (Sandbox Code Playgroud)

}

我希望我帮忙!


hha*_*ech 9

您可以使用以下代码来解决此问题

@Override
protected void onCreate(Bundle savedInstanceState)
{
    super.onCreate(savedInstanceState);
    listView = getListView();
    listView.setAdapter(adapter);

    listView.post(new Runnable()
    {
        public void run()
        {
            listView.setSelection(position);
        }
    });
} 
Run Code Online (Sandbox Code Playgroud)

要么

listView.setAdapter(adapter);
listView.setSelection(position);
adapter.notifyDataSetChanged(); 
Run Code Online (Sandbox Code Playgroud)

或请参考以下链接:

http://www.codeproject.com/Tips/514527/ListActivity-setSelection-within-onCreate

我希望你能得到解决方案.谢谢


A-I*_*-IV 7

数据更改后,您无法直接设置选择.试试这个:

@Override public void onRestoreInstanceState(Bundle savedInstanceState) {
    ...
    final int listIndex = savedInstanceState.getInt("ListIndex");
    f_listView.post(new Runnable() {
        @Override
        public void run() {
            listView.setSelection(listIndex);
        }
    });
}
Run Code Online (Sandbox Code Playgroud)