【发布时间】: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