片段不在fragmentmanager中:Viewpager:onNotifyDataSetChanged:IllegalStateException

时间:2015-03-09 17:28:30

标签: android android-fragments android-viewpager

无论我申请了多少解决方案,我都无法摆脱这个错误。

  

************错误的原因************   java.lang.IllegalStateException:片段b {4210f838}当前不在android.support.v4.app.ja的FragsManager(FragmentManager.java:603)中(FragmentStatePagerAdapter.java:136) )在Android.support.v4.view.v4.view.ViewPager $ h.onChanged(ViewPager.java:2824)的android.sdpport.DataSetObservable.notifyChanged的android.support.v4.view.ViewPager.b(ViewPager.java:874)位于com.aad $ 1.onAnimationEnd(ParallelAnimator.java)的com.xyz.Activity2 $ 2.a(Activity2.java:351)上的android.support.v4.view.kc(PagerAdapter.java:276)中的DataSetObservable.java:37) :73)在android.animation.AnimatorSet $ AnimatorSetListener.onAnimationEnd(AnimatorSet.java:765)在android.animation.AnimatorSet $ AnimatorSetListener.onAnimationEnd(AnimatorSet.java:765)在android.animation.ValueAnimator.endAnimation(ValueAnimator.java: 1018)在android.animation.ValueAnimator.access $ 400(ValueAnimator.java:51)在android.animation.ValueAnimator $ AnimationHandler.doAnimationFrame(ValueAnimator.java:623) droid.animation.ValueAnimator $ AnimationHandler.run(ValueAnimator.java:639)在android.view.Choreographer $ CallbackRecord.run(Choreographer.java:725)在android.view.Choreographer.doCallbacks(Choreographer.java:555)在android .view.Choreographer.doFrame(Choreographer.java:524)位于android.view上的android.view.Choreographer $ FrameDisplayEventReceiver.run(Choreographer.java:711)android.os.Handler.handleCallback(Handler.java:615)。在android.app.Looper.loop(Looper.java:137)上的Handler.dispatchMessage(Handler.java:92)位于android.app.ActivityThread.main(ActivityThread.java:4898)的java.lang.reflect.Method.invokeNative (本地方法)位于com.android.internal.os的com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit.java:1006)的java.lang.reflect.Method.invoke(Method.java:511) .zygoteInit.main(ZygoteInit.java:773)at dalvik.system.NativeStart.main(Native Method)

我正在使用的代码:

public class PlaceSlidesFragmentAdapter extends FragmentStatePagerAdapter implements IconPagerAdapter {

private List<String> imgList;

Activity activity;

public PlaceSlidesFragmentAdapter(Activity act, FragmentManager fm) {
    super(fm);

    imgList = new ArrayList<String>();
    activity= act;
}

public void addImage(String imgUrl)
{
    imgList.add(imgUrl);
}

public void addAllImages()
{
    for(All Image URLs)
    {
        addImage(s);
    }
}

public void removeAllImages()
{
    imgList.clear();
}

public String getImageName(int pos)
{
    return imgList.get(pos);
}


@Override
public Fragment getItem(int position) {
    return new PlaceSlideFragment(imgList.get(position));
}

@Override
public int getCount() {
    return imgList.size();
}

@Override
public int getIconResId(int index) {
    return 0;
}

@Override
public int getItemPosition(Object object){
    return PagerAdapter.POSITION_NONE;
}

}

我在调用onNotifyDataSetChanged()时遇到错误。基本上我在一个活动中有这个viewpager,我在运行时动态添加/删除片段。使用这个:

mAdapter.removeAllImages();
mAdapter.addAllImages();        
mAdapter.notifyDataSetChanged();

崩溃每天发生20次,每天约500-700人。我还没能在我的系统上重现它。如果您需要任何其他信息,请与我们联系。

如果有人可以帮忙解决这个问题。这将是一个很大的帮助。 感谢

编辑:

        // set-up image view-pager
    mAdapter = new PlaceSlidesFragmentAdapter(this, getSupportFragmentManager());
    mPager = (ViewPager)findViewById(R.id.pager);
    mPager.setAdapter(mAdapter);

2 个答案:

答案 0 :(得分:0)

创建/提交片段时使用

getChildFragmentManager() 

而不是

getFragmentManager()

这应该有效,因为适配器层次结构是片段是制表符管理器的子节点。

编辑:

试试这个:

mAdapter = new PlaceSlidesFragmentAdapter(this, getChildFragmentManager());
mPager = (ViewPager)findViewById(R.id.pager);
mPager.setAdapter(mAdapter);

答案 1 :(得分:0)

正如我的评论所述,您的适配器显然与FragmentManager不同步。你正在使用pageradapter进行动态处理,并且在页面调度器中执行动态内容的唯一安全方法是使用此方法:Retrieve a Fragment from a ViewPager

如果你这样实现它,你不应该在你的适配器中得到任何非法状态。