【问题标题】:Trouble with IllegalStateException using ViewPager and FragmentStatePagerAdapter使用 ViewPager 和 FragmentStatePagerAdapter 遇到 IllegalStateException 问题
【发布时间】:2014-10-17 16:34:19
【问题描述】:

我在使用带有 FragmentStatePagerAdapter 的 ViewPager 时遇到问题。基本上,在运行时,我想随着时间的推移向 ViewPager 添加新的片段。由于某种原因,第一个片段添加成功,但是第二个片段导致“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;
       }
   }

当添加第二个片段时,应用程序崩溃 :( 唉,我这辈子都想不通。

【问题讨论】:

  • 分享您要替换片段的主要活动...
  • 嗨 rohit 谢谢你的帮助。我现在已经更新了主帖。

标签: android android-fragments android-viewpager android-fragmentactivity


【解决方案1】:

将您的 Fragment 类添加到 mainactivity 中的 List 中,如下所示,

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();
    }
}

【讨论】:

  • 嗨纳伦德拉,谢谢你的帖子。你能帮我吗 - 如果我想实时添加片段而不是只在开始时怎么办?
  • 推荐使用 FragmentPagerAdapter 而不是 FragmentStatePagerAdapter?
  • 嗨 Narendra,你知道如何在运行时添加片段吗?
  • 谢谢你纳伦德拉!它似乎正在工作。我在 MyPagerAdapter 中添加了以下函数: public void addFrag(Ad ad) { AdFragment f = new AdFragment(ad);碎片.add(f); this.notifyDataSetChanged(); }
  • 在 OnTabChanged() 上使用这一行 mViewPager.setCurrentItem(pos);
【解决方案2】:

只需实现 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);
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-16
    相关资源
    最近更新 更多