6

精简版:

我有一个有 ViewPager 的 Activity。ViewPager 里面有三个片段。我通过实现 Parcelable 并将其存储在包中来将数据存储在片段中。

现在的问题是我在哪里恢复数据。我很困惑,因为(据我所知)每次旋转屏幕时,ViewPager 都会创建片段的新实例。(创建了一个新活动 -> 新 ViewPager -> 新片段)。如果我错了,请纠正我。

长版:

我在 MainActivity 中的 ViewPager

ViewPager viewPager = (ViewPager) findViewById(R.id.viewpager);
viewPager.setAdapter(new ForecastFragmentPageAdapter(getSupportFragmentManager(),
            ForecastActivity.this));
viewPager.setOffscreenPageLimit(2);

我的 FragmentPagerAdapter

 @Override
public Fragment getItem(int position) {
    if (position == 0) {
        return new NowForecastFragment();
    } else if (position == 1) {
        return new HourlyForecastFragment();
    } else {
        return new DailyForecastFragment();
    }
}

在我的片段之一中保存状态

    public void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);

    // save data source
    if (nowDataList != null) {
        outState.putParcelableArrayList("savedNowDataList", nowDataList);
    }
}

提前致谢!

更新:

根据发布到类似问题的其他解决方案,我还添加了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);
    }
}

并在 onCreateView 中恢复

 if(savedInstanceState!=null) {
            Log.v("---------------->","restored!");
            nowDataList = savedInstanceState.getParcelableArrayList("savedNowDataList");
            nowForecastAdapter.notifyDataSetChanged();
        }

我看到两个日志都被触发了。为什么数据没有恢复?

4

2 回答 2

14

ViewPager保存它的状态时,它会调用saveState()它的适配器。同样,当ViewPager它恢复其状态时,它会调用restoreState适配器。

您可以实现这些方法,但这已经完成了。只需扩展FragmentStatePagerAdapter而不是,FragmentPagerAdapter您就可以免费获得这些方法实现。

如果您扩展FragmentStatePagerAdapter然后实现onSaveInstanceState()并恢复onCreateView()您的Fragment类的状态,那么一切都应该按您的预期工作。

于 2015-06-24T06:14:40.813 回答
6

所以我找到了问题所在。只是在这里发布答案。所以当屏幕旋转时,虽然我正在更新数据源,但我并没有用更新的适配器重新附加列表视图。所以我就这么做了,而且效果很好。

if(savedInstanceState!=null) {
        Log.v("---------------->","restored!");
        nowDataList = savedInstanceState.getParcelableArrayList("savedNowDataList");
        nowForecastAdapter = new NowForecastAdapter(this, nowDataList); 
        lvNowList.setAdapter(nowForecastAdapter);           
        nowForecastAdapter.notifyDataSetChanged();
    }

如果有人犯了同样的错误并且想知道出了什么问题,请发布答案。

于 2015-06-24T23:15:21.017 回答