我在使用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只选择列表视图项目,但文档说这个方法将对齐列表视图,无论是否处于触摸模式。
有谁知道为什么这不起作用或是否有更好的方法来解决这个问题?
谢谢,非常感谢您的帮助!
答案 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);