setSelection不更改ListView位置

时间:2011-08-10 22:56:13

标签: 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);
}

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

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

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

8 个答案:

答案 0 :(得分:33)

如果有进一步的帮助,在这个问题丢失几个小时之后,我设法使用相同的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();
    }
});

}

我希望我帮忙!

答案 1 :(得分: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);
        }
    });
} 

OR

listView.setAdapter(adapter);
listView.setSelection(position);
adapter.notifyDataSetChanged(); 

或请参考以下链接:

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

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

答案 2 :(得分: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);
        }
    });
}

答案 3 :(得分:3)

也许你应该使用&#34; smoothScrollToPosition(int position)&#34;如果您处于SDK级别&gt; = 8。

答案 4 :(得分:0)

如果ListView位于ListFragment中,只需调用setSelection()

答案 5 :(得分:0)

对我有用的唯一解决方案是:

    mListView.postDelayed(new Runnable() {
        @Override
        public void run() {
            mListView.setSelection(index);
        }
    }, 300);

看起来很糟糕,但这种方式适用于触控和非触控模式。

答案 6 :(得分:0)

我认为我找到了最好的解决方案,而不使用post a Runnable:

list.setAdapter(adapter);
list.setSelection(list.getCount() - 1);

答案 7 :(得分:0)

使用此代码,

sp2.setAdapter(sp2.getAdapter());
        sp2.getAdapter().notifyDataSetChanged();
        sp2.setSelection(0, false);