1

私のアクティビティには、シンプルな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 つのアダプター) での状態保存に関する良い情報はほとんどありません。

4

0 に答える 0