私のアクティビティには、シンプルなviewPager + viewPagerAdapterがあります:
public class SearchFragmentAdapter extends FragmentPagerAdapter {
// holds fragments placed in the viewPager
private SparseArray<SearchFragment> mFragments;
public SearchFragmentAdapter(Context context, FragmentManager fragmentManager, String queryText) {
super(fragmentManager);
mFragments = new SparseArray<SearchFragment>();
List<Fragment> savedFragments = fragmentManager.getFragments();
// try to restore fragments from fragmentManager
if (savedFragments != null) {
for (int i = 0; i < savedFragments.size(); i++) {
if (savedFragments.get(i) instanceof SearchFragment) {
mFragments.put(i, (SearchFragment) savedFragments.get(i));
}
}
}
}
@Override
public Fragment getItem(int position) {
SearchFragment fragment = mFragments.get(position);
return (fragment == null) ? new SearchFragment() : fragment;
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
// see if we already have this fragment
SearchFragment fragment = mFragments.get(position);
// if not => instantiate new fragment
if (fragment == null) {
final SearchFragment searchFragment = (SearchFragment) super.instantiateItem(container, position);
mFragments.put(position, searchFragment);
return searchFragment;
}
return fragment;
}
}
viewPager の各ページには、1 つの SearchFragment があります。すべての SearchFragment には、ListView + listViewAdapter のみがあります。
public class ListViewAdapter extends ArrayAdapter<Suggestion> {
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// typical holder pattern
if (convertView == null) {
convertView = LayoutInflater.from(mActivity).inflate(R.layout.row_suggestion, parent, false);
}
...
}
}
listView のすべての行には、別のアクティビティを開始するボタンがあります (YouTubePlayer ですが、これは重要ではありません)。YouTube ビデオが終了するか、ユーザーが [戻る] ボタンをクリックすると、YouTubePlayer-Activity が閉じ、自分の Activity + ViewPager + ViewPages の SearchFragments + SearchFragments の ListViews が再び表示されます。
viewPager の位置 (Activity のフィールドに保存) を復元できますが、viewPager の SearchFragments (上記の SearchFragmentAdapter のコンストラクターを参照)
ListView のコンテンツとスクロール位置を保持する ListView と ListViewAdapter を復元できません。もちろん、構成の変更でも同じことが起こります。Activity が再度ビルドされ、そのフィールドから viewPager の位置を復元できますが、スクロール位置、特に SearchFragments のコンテンツは失われます。
デバイスを回転させた後、少なくとも listViews のコンテンツ (スクロール位置は便利です) を復元するにはどうすればよいですか?
viewPager と ListViews の状態保存についてはよく読んでいますが、この組み合わせ (viewPager + listView = 独自の状態とコンテンツを持つ 2 つのアダプター) での状態保存に関する良い情報はほとんどありません。