6

短縮版:

ViewPager を持つアクティビティがあります。ViewPager の内部には 3 つのフラグメントがあります。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();
    }
}

フラグメントの 1 つに状態を保存する

    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

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 に答える