1

我的 Activity 有一个简单的 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 的每一页中都有一个 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 的每一行都有一个按钮,用于启动另一个 Activity(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