在哪里还原ViewPager内部的片段状态 [英] Where to restore fragment state that is inside ViewPager

查看:117
本文介绍了在哪里还原ViewPager内部的片段状态的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

短版:

我有一个带有ViewPager的活动. ViewPager内部有三个片段.我通过实现Parcelable将数据存储在片段内部,并将其存储在包中.

I have an Activity that has a ViewPager. The ViewPager has three fragments inside it. I am storing the data inside the fragments by implementing Parcelable and storing it inside the bundle.

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

Now the question is where do I restore the data. I am confused because (from what I know) the ViewPager is creating a new instance of the fragment each time I rotate the screen. (A new activity is created -> new ViewPager -> new Fragment). Please do correct me if I am wrong.

长版:

MainActivity中的我的ViewPager

My ViewPager inside MainActivity

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

我的FragmentPagerAdapter

My FragmentPagerAdapter

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

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

Saving state in one of my fragments

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

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

提前谢谢!

更新:

根据发布到类似问题的其他解决方案,我还在片段的onCreateView中添加了 setRetainInstance(true); .这就是我保存和恢复状态的方式:

According to other solutions posted to similar problems, I also added setRetainInstance(true); in the onCreateView of my fragment. And this is how I am saving and restoring state:

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

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

并在onCreateView中还原

and restoring in onCreateView

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

我看到两个日志都被触发了.为什么不能还原数据?

I see both the logs being triggered. Why is the data not being restored?

推荐答案

所以我找到了问题所在.只需在此处发布答案即可.因此,当旋转屏幕时,尽管我正在更新数据源,但尚未将列表视图与更新的适配器重新连接.所以我就这样做了,而且行得通.

So I found where the problem was. Just posting the answer here. So when the screen is rotated, although I am updating the data source, I have not reattached the listview with the updated adapter. So I just did that and it works.

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

只要有人犯了同样的错误并且想知道出了什么问题,就发布答案.

Just posted the answer if anyone made the same mistake and was wondering what went wrong.

这篇关于在哪里还原ViewPager内部的片段状态的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆