如何故意用viewpager重新创建片段?

时间:2013-03-02 20:26:18

标签: android override android-viewpager fragment

我正在使用ViewPager和一些片段。我想实现下一个小效果:如果我滑到viewpager的第一页(所以页面的索引等于0),我想重新创建它。所以我不希望它被从内存中拉出来,我想每次刷到那个页面时重新创建它。 我读到我需要覆盖instantiateItem方法,但我不能这样做。

public class PagerAdapter1 extends FragmentPagerAdapter {

    private List<String> fragments;
       private static final String TAG = "FragmentPagerAdapter";
        private static final boolean DEBUG = false;

        private final FragmentManager mFragmentManager;
        private FragmentTransaction mCurTransaction = null;

    /**
     * @param fm
     * @param fragments2
     */
    public PagerAdapter1(FragmentManager fm, List<String> fragments2) {
        super(fm);
        mFragmentManager=fm;
        this.fragments = fragments2;
    }
    /* (non-Javadoc)
     * @see android.support.v4.app.FragmentPagerAdapter#getItem(int)
     */
    @Override
    public Fragment getItem(int position) {
        //return this.fragments.get(position);
        return Fragment.instantiate(ViewPagerActivity.context, fragments.get(position));
    }

    /* (non-Javadoc)
     * @see android.support.v4.view.PagerAdapter#getCount()
     */
    @Override
    public int getCount() {
        return this.fragments.size();
    }



    @Override
    public Object instantiateItem(View container, int position) {
       Log.i("OVERRIDE", "OVERRIDE");

        if (mCurTransaction == null) {
            mCurTransaction = mFragmentManager.beginTransaction();
        }

        // Do we already have this fragment?
        String name = makeFragmentName(container.getId(), position);
        Fragment fragment = mFragmentManager.findFragmentByTag(name);
        if (fragment != null) {
            if (DEBUG) Log.v(TAG, "Attaching item #" + position + ": f=" + fragment);
            mCurTransaction.attach(fragment);
        } else {
            fragment = getItem(position);
            if (DEBUG) Log.v(TAG, "Adding item #" + position + ": f=" + fragment);
            mCurTransaction.add(container.getId(), fragment,
                    makeFragmentName(container.getId(), position));
        }

        return fragment;
    }
    private static String makeFragmentName(int viewId, int index) {
        return "android:switcher:" + viewId + ":" + index;
    }
} 

我从未获得OVERRIDE标签。所以我的第一个问题是,为什么我不明白?我应该如何重写这个方法(如果这是我需要的)来实现我之前写的效果?我想要它,因为我在第0页保存了一个复选框的状态,但优化扭曲它,因为如果我滑到第1页上,页面0不会被销毁,所以它不会重新创建它,并且复选框的状态不会被保存(除非我刷到第2页,因为我使用setOffScreenLimit(1))。

1 个答案:

答案 0 :(得分:2)

mAdapter.notifyDataSetChanged()是一个解决方案。但是,这会删除所有页面并通过再次实例化将它们放回去。好消息是没有引起任何副作用。 (强制关闭或例外)