Marek Loose
Marek Loose

Reputation: 1185

Android Infinite ViewPager items in order

I'm trying to add Infinite ViewPager like this

A <--> B <--> C <--> D <--> A <--> B...

I used hack from this webside but that solution is not showing items in order.

Is there any way I could show them in order using current code, or is there a better solution?

I realise there are a lot of similar questions but I can't found an answer which would suit my needs.

I'm using android.support.v4.view.ViewPager

My Activity:

ViewPager mPager;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_infinite_view_pager);
    mPager = (ViewPager) findViewById(R.id.frame);
    mPager.setOffscreenPageLimit(1);
    mPager.setAdapter(new EndLessAdapter(this, mImageArray));
    mPager.setCurrentItem(Integer.MAX_VALUE / 2);
}

private int[] mImageArray = { R.drawable.image1, R.drawable.image2,
        R.drawable.image3, R.drawable.image4 };

My PagerAdapter:

FragmentActivity activity;
int imageArray[];

public EndLessAdapter(FragmentActivity act, int[] imgArra) {
    imageArray = imgArra;
    activity = act;
}

public int getCount() {
    return Integer.MAX_VALUE;
}

private int pos = 0;

public Object instantiateItem(View collection, int position) {

    ImageView mwebView = new ImageView(activity);
    ((ViewPager) collection).addView(mwebView, 0);
    mwebView.setScaleType(ScaleType.FIT_XY);
    mwebView.setImageResource(imageArray[pos]);

    if (pos >= imageArray.length - 1)
        pos = 0;
    else
        ++pos;

    return mwebView;
}

@Override
public void destroyItem(View arg0, int arg1, Object arg2) {
    ((ViewPager) arg0).removeView((View) arg2);
}

@Override
public boolean isViewFromObject(View arg0, Object arg1) {
    return arg0 == ((View) arg1);
}

@Override
public Parcelable saveState() {
    return null;
}

Upvotes: 0

Views: 79

Answers (1)

Pasi Matalam&#228;ki
Pasi Matalam&#228;ki

Reputation: 1853

The problem is that you're keeping some variable 'pos' to handle the changing of image, but if the items are instantiated in other order or multiple times, it gets 'out of sync' and that is not even required anyway.

You should use modulo instead.

In your method instantiateItem

you could do it in the following way:

mwebView.setImageResource(imageArray[position % imageArray.length]);

Upvotes: 1

Related Questions