0

我在使用帶有FragmentStatePagerAdapter的ViewPager時遇到問題。基本上,在運行時,我想隨着時間的推移向ViewPager添加新的片段。出於某種原因,第一個片段已成功添加,但第二個片段導致「IllegalStateException」。使用ViewPager和FragmentStatePagerAdapter時發生IllegalStateException的問題

 public class AdActivity extends FragmentActivity implements IChannelListener 
{ 
    private static final String TAG = "AdActivity"; 
    public static int NUM_PAGES = 0; 
    private VerticalViewPager mPager; 
    private PagerAdapter mPagerAdapter; 

    public Channel getChannel() { 
     return channel; 
    } 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     AdController.getInstance().setAdActivity(this); 
     Log.d(TAG, "onCreate()"); 
     setContentView(R.layout.activity_ad); 

     // Instantiate a ViewPager and a PagerAdapter. 
     mPager = (VerticalViewPager) findViewById(R.id.pager); 
     mPagerAdapter = new AdPagerAdapter(getFragmentManager()); 
     mPager.setAdapter(mPagerAdapter); 
     mPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() { 
      @Override 
      public void onPageSelected(int position) { 
       invalidateOptionsMenu(); 
      } 
     }); 

     // To stop destroying unused fragments 
     mPager.setOffscreenPageLimit(15); 

     Log.d(TAG, "endOfOnCreate()"); 
    } 

    public void insertAdFragment(final Ad ad) { 
     Log.d(TAG, "insertAdFragment()"); 
     runOnUiThread(new Runnable(){ 
      @Override 
      public void run() 
      { 
       AdFragment fragment = new AdFragment(ad); 
       AdFragment.fragments.add(0, fragment); 
       NUM_PAGES = NUM_PAGES + 1; 
       mPagerAdapter.notifyDataSetChanged(); 
      } 
     }); 

     Log.d(TAG, "end insertAdFragment()"); 
    } 

    /* 
    * Pager Adapter that represents the objects in sequence. 
    * */ 
    private class AdPagerAdapter extends FragmentStatePagerAdapter 
    { 
    private static final String TAG = "AdPagerAdapter"; 

     public AdPagerAdapter(FragmentManager fragmentManager) 
     { 
      super(fragmentManager); 
      Log.d(TAG, "AdPagerAdapter()"); 
     } 

    @Override 
     public Fragment getItem(int position) 
     { 
     Log.d(TAG, "getItem(" + position + ") : size of fragments is... " + AdFragment.fragments.size()); 
      //return AdFragment.create(position); 
     return AdFragment.fragments.get(position); 
     } 

     @Override 
     public int getCount() { 
      Log.d(TAG, "getCount() : " + NUM_PAGES); 
      return NUM_PAGES; 
     } 
    } 
} 

上述insertAdFragment功能是每分鐘一次調用。在到達函數之前,NUM_PAGES的值爲0.將一個片段添加到「片段」列表的開頭。然後,調用notifyDataSetChanged()。下面是AdPagerAdapter:

private class AdPagerAdapter extends FragmentStatePagerAdapter 
    { 
    private static final String TAG = "AdPagerAdapter"; 

     public AdPagerAdapter(FragmentManager fragmentManager) 
     { 
      super(fragmentManager); 
      Log.d(TAG, "AdPagerAdapter()"); 
     } 

    @Override 
     public Fragment getItem(int position) 
     { 
     Log.d(TAG, "getItem(" + position + ") : size of fragments is... " + AdFragment.fragments.size()); 

     return AdFragment.fragments.get(position); 
     } 

     @Override 
     public int getCount() { 
      Log.d(TAG, "getCount() : " + NUM_PAGES); 
      return NUM_PAGES; 
     } 
    } 

當添加第二個片段,應用程序崩潰:(唉,我不能爲我的生活想出解決辦法

+0

分享您的主要活動...... – 2014-10-17 07:38:41

+0

嗨羅希特感謝你的幫助。我現在已經更新了主帖。 – codeshark 2014-10-17 07:43:06

回答

1

添加您的片段類mainactivity到列表。下面,

private void ViewPagerInitialize() 
    { 
     List<Fragment> fragments = new Vector<Fragment>(); 
      fragments.add(Fragment.instantiate(this, AndroidFragment.class.getName())); 
      fragments.add(Fragment.instantiate(this, AppleFragment.class.getName())); 
      fragments.add(Fragment.instantiate(this, MicrosoftFragment.class.getName())); 
      mPageradapter = new MyPagerAdapter(super.getSupportFragmentManager(), fragments); 
      mViewPager = (ViewPager)super.findViewById(R.id.pager); 
      mViewPager.setAdapter(mPageradapter); 
      mViewPager.setOnPageChangeListener(this); 
    } 

,並使用該視圖尋呼機適配器類

public class MyPagerAdapter extends FragmentPagerAdapter 
{ 
    private List<Fragment> fragments; 
    public MyPagerAdapter(FragmentManager mFManager,List<Fragment> fragments) { 
     super(mFManager); 
     this.fragments = fragments; 
    } 
    @Override 
    public Fragment getItem(int arg0) { 

     return fragments.get(arg0); 
    } 

    @Override 
    public int getCount() { 
     return this.fragments.size(); 
    } 
} 
+0

嗨Narendra,謝謝你的帖子。你能幫我嗎?如果我想實時添加一個片段而不是隻在開始時添加一個片段? – codeshark 2014-10-17 07:45:24

+0

是否推薦使用FragmentPagerAdapter而不是FragmentStatePagerAdapter? – codeshark 2014-10-17 07:46:47

+0

嗨Narendra,你知道如何在運行時添加一個片段嗎? – codeshark 2014-10-17 08:03:53

1

只是我mplement onpagechangelistener並在您更換碎片覆蓋此方法

@Override 
    public void onPageScrollStateChanged(int arg0) 
    { 
    } 
    @Override 
    public void onPageScrolled(int arg0, float arg1, int arg2) 
    { 
    } 
    @Override 
    public void onPageSelected(int arg0) { 
     mTabHost.setCurrentTab(arg0); 
    } 
相關問題