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); 
    } 
相关问题