我正在努力恢复我在屏幕轮换配置更改的列表视图中的位置。
在我试过的很多事情中,我来到这里:
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
if (savedInstanceState == null) {
...
mVisibleItem = -1;
} else {
if (savedInstanceState.containsKey(LV_VISIBLE_ITEM)) {
mVisibleItem = savedInstanceState.getInt(LV_VISIBLE_ITEM);
}
}
setRetainInstance(true);
}
这里我试图在listview中设置位置
@Override
public void onResume() {
super.onResume();
if (mVisibleItem > 0) {
mlvDictionaryIndex.setSelectionFromTop(mVisibleItem, 0);
}
}
然而,令我惊讶的是,在旋转屏幕并观察mVisibleItem被设置为正确的值后,在onResume中我看到mVisibleItem等于-1。怎么样?
答案 0 :(得分:1)
使用onSavedInstanceState
在包中写入ListView.onSaveInstanceState()
的返回值,并将其恢复为onActivityCreated
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
if (mListView != null) {
outState.putParcelable(LISTVIEW_INTERNAL_STATE_KEY, mListView.onSaveInstanceState());
}
}
重新加载数据后,您可以调用
mListView.onRestoreInstanceState(savedInstanceState.getParcelable(LISTVIEW_INTERNAL_STATE_KEY));
答案 1 :(得分:0)
覆盖onSaveInstanceState,例如“
下面 @Override
public void onSaveInstanceState(Bundle savedInstanceState) {
super.onSaveInstanceState(savedInstanceState);
savedInstanceState.putInt("pos", pos);
}
然后在onCreate方法中读取savedInstanceState以检查这是方向更改还是新活动。
private int pos = 0;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (savedInstanceState == null) {
//This is a new activity
}else{
pos = savedInstanceState.getInt("");
}
现在您在列表中有位置,您可以在配置更改中滚动到此位置。
答案 2 :(得分:0)
也许在重新加载listview
中的数据之后,下面的代码将起作用。
mlvDictionaryIndex.setSelectionFromTop(mVisibleItem, 0);
所以你可以使用post()
方法,如下所示:
post(new Runnable() {
public void run() {
mlvDictionaryIndex.setSelectionFromTop(mVisibleItem, 0);
}
});