我遇到ViewPager的问题,我的ListView失去了它的滚动位置。
可以使用以下方法轻松存储和恢复ListView的状态:
@Override
public View onCreateView (LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState)
{
View v = inflater.inflate(R.layout.frag_cool_things, container, false);
AdvListView listView = (AdvListView) v.findViewById(R.id.lv0);
listView.setOnItemClickListener( mOnListItemClicked );
if (null != savedInstanceState)
{
listView.onRestoreListViewInstanceState(savedInstanceState.getParcelable("list_state"));
}
mListView = listView;
return v;
}
@Override
public void onSaveInstanceState (Bundle outState)
{
super.onSaveInstanceState(outState);
outState.putParcelable("list_state", mListView.onSaveListViewInstanceState());
}
然而问题是,当正在刷新片段时onDestroyView()
被调用但从不调用onSaveInstanceState (Bundle outState)
。
旋转屏幕等恢复ListView
状态就好了,但是滑动我无法弄清楚如何正确恢复列表。
答案 0 :(得分:15)
更新12/17/11:
我实际上找到了保存片段内容的正确方法。您必须使用FragmentStatePagerAdapter
。此适配器正确保存片段的状态! :)
<强> OLD:强>
好吧,我找到了一种方法来做到这一点..如果你认为这是一个巨大的不,请分享你的意见! :P
这是解决此问题的FragmentBase类:
public abstract class FragmentBase extends Fragment
{
private boolean mInstanceAlreadySaved;
private Bundle mSavedOutState;
@Override
public View onCreateView (LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState)
{
if (null == savedInstanceState && null != mSavedOutState) {
savedInstanceState = mSavedOutState;
}
mInstanceAlreadySaved = false;
return onCreateViewSafe(inflater, container, savedInstanceState);
}
@Override
public void onSaveInstanceState (Bundle outState)
{
super.onSaveInstanceState(outState);
mInstanceAlreadySaved = true;
}
@Override
public void onStop()
{
if (!mInstanceAlreadySaved)
{
mSavedOutState = new Bundle();
onSaveInstanceState( mSavedOutState );
}
super.onStop();
}
public abstract View onCreateViewSafe (LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState);
}