我在使用帶有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