我在使用带有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;
}
}
当添加第二个片段,应用程序崩溃:(唉,我不能为我的生活想出解决办法
分享您的主要活动...... – 2014-10-17 07:38:41
嗨罗希特感谢你的帮助。我现在已经更新了主帖。 – codeshark 2014-10-17 07:43:06