Welcome to ShenZhenJia Knowledge Sharing Community for programmer and developer-Open, Learning and Share
menu search
person
Welcome To Ask or Share your Answers For Others

Categories

I'm currently testing out the viewpager in Android. Created a custom adapter, but I got this error when I tried to swipe the viewpager. Could anyone help me with this?

public class ViewPagerAdapter extends PagerAdapter {
    Context context;
    int[] flag;
    LayoutInflater inflater;

    public ViewPagerAdapter(Context context, int[] flag) {
        this.context = context;
        this.flag = flag;
    }

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

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

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        ImageView imgflag;

        inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View itemView = inflater.inflate(R.layout.viewpager_item,  container, false);
        //ImageView imageView = new ImageView(context);
        //imageView.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
        //imageView.findViewById(R.id.flag);
        imgflag = (ImageView) itemView.findViewById(R.id.flag);
        imgflag.setImageResource(flag[position]);
        ((ViewPager) container).addView(imgflag);

        return imgflag;
    }


    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        ((ViewPager) container).removeView((ImageView) object);

    }

LOGCAT :

05-02 10:35:26.926: E/AndroidRuntime(4939): FATAL EXCEPTION: main
05-02 10:35:26.926: E/AndroidRuntime(4939): java.lang.IllegalStateException: The specified child already has a parent. You must call removeView() on the child's parent first.

Edits Suggested By Richard:

public class ViewPagerAdapter extends PagerAdapter {
Context context;
int[] flag;
LayoutInflater inflater;
ImageView imgflag;
View itemView;

public ViewPagerAdapter(Context context, int[] flag) {
    this.context = context;
    this.flag = flag;
}

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

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

@Override
public Object instantiateItem(ViewGroup container, int position) {


    inflater = (LayoutInflater) context
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    itemView = inflater.inflate(R.layout.viewpager_item,  container, false);
    //ImageView imageView = new ImageView(context);
    //imageView.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
    //imageView.findViewById(R.id.flag);
    imgflag = (ImageView) itemView.findViewById(R.id.flag);
    imgflag.setImageResource(flag[position]);

    ((ViewPager) container).addView(itemView);

    //return imgflag;
    return itemView;
}


@Override
public void destroyItem(ViewGroup container, int position, Object object) {
    //((ViewPager) container).removeView((ImageView) object);
    ((ViewPager) container).removeView(itemView);
    //((ViewGroup)imgflag.getParent()).removeView(imgflag);

}

}

LOGCAT :

05-02 10:55:42.786: E/AndroidRuntime(7763): FATAL EXCEPTION: main
05-02 10:55:42.786: E/AndroidRuntime(7763): java.lang.ClassCastException: android.widget.RelativeLayout cannot be cast to android.widget.ImageView
See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
thumb_up_alt 0 like thumb_down_alt 0 dislike
126 views
Welcome To Ask or Share your Answers For Others

1 Answer

It's because you you are returning the imgFlag instead of itemView. You also need to add the itemView to the pager instead of adding the imgFlag.

The inflater sets the parent of imgFlag to itemView and then you try to add imgFlag to the viewpager without removing it from the itemView first.

Edit: It's most likely because of :

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

public class ViewPagerAdapter extends PagerAdapter { Context context; int[] flag; LayoutInflater inflater;

public ViewPagerAdapter(Context context, int[] flag) {
    this.context = context;
    this.flag = flag;
}

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

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

@Override
public Object instantiateItem(ViewGroup container, int position) {
    ImageView imgflag;

    inflater = (LayoutInflater) context
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    View itemView = inflater.inflate(R.layout.viewpager_item,  container, false);
    //ImageView imageView = new ImageView(context);
    //imageView.setScaleType(ImageView.ScaleType.CENTER_INSIDE);
    //imageView.findViewById(R.id.flag);
    imgflag = (ImageView) itemView.findViewById(R.id.flag);
    imgflag.setImageResource(flag[position]);
    ((ViewPager) container).addView(imgflag);

    return imgflag;
}


@Override
public void destroyItem(ViewGroup container, int position, Object object) {
    ((ViewPager) container).removeView((RelativeLayout) object);

}

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
thumb_up_alt 0 like thumb_down_alt 0 dislike
Welcome to ShenZhenJia Knowledge Sharing Community for programmer and developer-Open, Learning and Share
...