【问题标题】:IllegalStateException when using ViewPager without Fragments使用不带片段的 ViewPager 时出现 IllegalStateException
【发布时间】:2016-11-23 16:51:40
【问题描述】:

我使用ViewPager 在图像之间滑动。我的ViewPager 不使用任何Fragment。当我滑动到下一张图片时,我的应用程序崩溃并在 instantiateItem() 中发生异常。这是我的适配器类:

public class SlidePagerAdapter extends PagerAdapter {
LayoutInflater mLayoutInflater;
Context context;
int[] mResources = {
        R.drawable.sports1,
        R.drawable.sports2,
        R.drawable.sports3,
};

public SlidePagerAdapter(Context context) {
    this.context = context;
}

@Override
public Object instantiateItem(ViewGroup container, int position) {
    mLayoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View itemView = mLayoutInflater.inflate(R.layout.viewpager, container, false);

    ImageView imageView = (ImageView) itemView.findViewById(R.id.viewpager_image);
    imageView.setImageResource(mResources[position]);

       container.addView(imageView);           // HERE MY APPLICATION CRASH
    // container.addView(imageView, position); 
    return imageView;
}

@Override
public boolean isViewFromObject(View view, Object object) {
    return view == object;
}

@Override
public int getCount() {
    return mResources.length;
}

@Override
public void destroyItem(ViewGroup container, int position, Object object) {
    container.removeView(((View) object).getRootView());
}
}

以下是日志详细信息:

java.lang.IllegalStateException: 指定的孩子已经有一个 父母。您必须首先在孩子的父母上调用 removeView()。 在 android.view.ViewGroup.addViewInner(ViewGroup.java:3938) 在 android.view.ViewGroup.addView(ViewGroup.java:3788) 在 android.support.v4.view.ViewPager.addView(ViewPager.java:1413) 在 android.view.ViewGroup.addView(ViewGroup.java:3729) 在 mycompany.microfinance.SlidePagerAdapter.instantiateItem(SlidePagerAdapter.java:37) 在 android.support.v4.view.ViewPager.addNewItem(ViewPager.java:943) 在 android.support.v4.view.ViewPager.populate(ViewPager.java:1157) 在 android.support.v4.view.ViewPager.populate(ViewPager.java:1025) 在 android.support.v4.view.ViewPager$3.run(ViewPager.java:254) 在 android.view.Choreographer$CallbackRecord.run(Choreographer.java:767) 在 android.view.Choreographer.doCallbacks(Choreographer.java:580) 在 android.view.Choreographer.doFrame(Choreographer.java:549) 在 android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:753) 在 android.os.Handler.handleCallback(Handler.java:739) 在 android.os.Handler.dispatchMessage(Handler.java:95) 在 android.os.Looper.loop(Looper.java:135) 在 android.app.ActivityThread.main(ActivityThread.java:5343) 在 java.lang.reflect.Method.invoke(本机方法) 在 java.lang.reflect.Method.invoke(Method.java:372) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:905) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:700)

我不知道如何解决它。我遵循了一个教程,我认为我遵循它是正确的。请帮助我找出我做错的地方。谢谢。

【问题讨论】:

  • onDestroyItem,只需删除object
  • FWIW,here is a sample activity 实现了无片段的ViewPager。正如 Spitsin 先生所指出的,您的问题在于 addView()/removeView() 调用中的并行性。那些需要匹配;你的没有。

标签: android android-viewpager


【解决方案1】:

你需要打电话给container.removeView(((View) object))而不是container.removeView(((View) object).getRootView());

据我了解,问题是您无法添加已添加的视图,因为您没有删除它,而是尝试删除其父视图

另外,请提供这个。

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

@Override
public boolean isViewFromObject(View view, Object object){
    return view.equals(object);
}

更新

我刚刚意识到,你在这部分的问题:

View itemView = mLayoutInflater.inflate(R.layout.viewpager, container, false);

ImageView imageView = (ImageView) itemView.findViewById(R.id.viewpager_image);
imageView.setImageResource(mResources[position]);

container.addView(imageView);  

如果imageView 是膨胀的itemView 中的某个子视图,那么您就有问题了,因为您尝试将imageView 添加到container,但它已经有父itemView。所以或者你需要在container 中添加不是imageView,而是itemView,或者你需要考虑你的通货膨胀。

【讨论】:

  • @andy 你看到我关于instantiateItem 方法的最新更新了吗?
【解决方案2】:

如果您的其他代码工作正常,这种情况应该可以工作!

if(imageView.getParent()!=null)
    ((ViewGroup)imageView.getParent()).removeView(imageView); // <- fix
layout.addView(imageView);

【讨论】:

  • 这不是一个修复,因为 removeView 必须在 destroyItem 方法中调用,作者调用它,但不幸的是不是为了视图,而是为了一些 rootView。
猜你喜欢
  • 2014-07-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-03
  • 1970-01-01
  • 2018-05-03
相关资源
最近更新 更多