2013-03-02 74 views
-1

我使用ViewPager和一些片段。我想實現下一個小小的效果:如果我滑動到viewpager的第一頁(所以頁面的索引等於0),我想重新創建它。所以我不希望它被從內存中拉出來,我希望每次滑動到該頁面時都要重新創建它。 我讀過,我需要重寫instantiateItem方法,但我不能這樣做。如何故意用viewpager重新創建片段?

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不會被銷燬,所以它不會重新創建它,並且複選框的狀態不會保存(除非我滑動到page2,因爲我使用setOffScreenLimit(1))。

回答

2

mAdapter.notifyDataSetChanged()是一個解決方案。但是,這將刪除所有頁面,並通過再次實例化將它們放回。好消息是尚未造成任何副作用。 (強行關閉,或例外)