Gau*_*dey 6 android android-fragments android-viewpager fragment-lifecycle
精简版:
我有一个具有ViewPager的Activity.ViewPager里面有三个片段.我通过实现Parcelable并将其存储在bundle中来将数据存储在片段中.
现在问题是我在哪里恢复数据.我很困惑,因为(据我所知)ViewPager每次旋转屏幕时都会创建片段的新实例.(创建一个新活动 - >新的ViewPager - > new Fragment).如果我错了,请纠正我.
长版:
我在MainActivity中的ViewPager
ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager);
viewPager.setAdapter(new ForecastFragmentPageAdapter(getSupportFragmentManager(),
ForecastActivity.this));
viewPager.setOffscreenPageLimit(2);
Run Code Online (Sandbox Code Playgroud)
我的FragmentPagerAdapter
@Override
public Fragment getItem(int position) {
if (position == 0) {
return new NowForecastFragment();
} else if (position == 1) {
return new HourlyForecastFragment();
} else {
return new DailyForecastFragment();
}
}
Run Code Online (Sandbox Code Playgroud)
在我的一个片段中保存状态
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
// save data source
if (nowDataList != null) {
outState.putParcelableArrayList("savedNowDataList", nowDataList);
}
}
Run Code Online (Sandbox Code Playgroud)
提前致谢!
更新:
根据发布到类似问题的其他解决方案,我还添加了setRetainInstance(true); 在我片段的onCreateView中.这就是我保存和恢复状态的方式:
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
// save data source
if (nowDataList != null) {
Log.v("---------------->","saved!");
outState.putParcelableArrayList("savedNowDataList", nowDataList);
}
}
Run Code Online (Sandbox Code Playgroud)
并在onCreateView中恢复
if(savedInstanceState!=null) {
Log.v("---------------->","restored!");
nowDataList = savedInstanceState.getParcelableArrayList("savedNowDataList");
nowForecastAdapter.notifyDataSetChanged();
}
Run Code Online (Sandbox Code Playgroud)
我看到两个日志都被触发了.为什么数据没有恢复?
kri*_*son 14
当ViewPager保存其状态时,它会调用saveState()它的适配器上.同样,当ViewPager恢复其状态时,它会调用restoreState适配器.
您可以实现这些方法,但这已经完成了.只需扩展FragmentStatePagerAdapter而不是,FragmentPagerAdapter您可以免费获得这些方法实现.
如果你扩展FragmentStatePagerAdapter然后实现onSaveInstanceState()并恢复onCreateView()你的Fragment类的状态,所有都应该按预期工作.
所以我找到了问题所在.只需在这里发布答案.因此,当屏幕旋转时,虽然我正在更新数据源,但我没有使用更新的适配器重新附加listview.所以我就这样做了,它的确有效.
if(savedInstanceState!=null) {
Log.v("---------------->","restored!");
nowDataList = savedInstanceState.getParcelableArrayList("savedNowDataList");
nowForecastAdapter = new NowForecastAdapter(this, nowDataList);
lvNowList.setAdapter(nowForecastAdapter);
nowForecastAdapter.notifyDataSetChanged();
}
Run Code Online (Sandbox Code Playgroud)
刚发布答案,如果有人犯了同样的错误,并想知道出了什么问题.
| 归档时间: |
|
| 查看次数: |
12031 次 |
| 最近记录: |