Android 无限 ViewPager 项目顺序
Android Infinite ViewPager items in order
我正在尝试像这样添加 Infinite ViewPager
A <--> B <--> C <--> D <--> A <--> B...
我使用了这个 webside 的 hack,但该解决方案没有按顺序显示项目。
有什么方法可以使用当前代码按顺序显示它们,或者有更好的解决方案吗?
我知道有很多类似的问题,但我找不到适合我需要的答案。
我正在使用 android.support.v4.view.ViewPager
我的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 };
我的 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;
}
问题是您保留了一些变量 'pos' 来处理图像的变化,但是如果项目以其他顺序或多次实例化,它会得到 'out of sync',那就是反正也不需要。
您应该改用 modulo。
在你的方法中 instantiateItem
您可以通过以下方式进行:
mwebView.setImageResource(imageArray[position % imageArray.length]);
我正在尝试像这样添加 Infinite ViewPager
A <--> B <--> C <--> D <--> A <--> B...
我使用了这个 webside 的 hack,但该解决方案没有按顺序显示项目。
有什么方法可以使用当前代码按顺序显示它们,或者有更好的解决方案吗?
我知道有很多类似的问题,但我找不到适合我需要的答案。
我正在使用 android.support.v4.view.ViewPager
我的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 };
我的 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;
}
问题是您保留了一些变量 'pos' 来处理图像的变化,但是如果项目以其他顺序或多次实例化,它会得到 'out of sync',那就是反正也不需要。
您应该改用 modulo。
在你的方法中 instantiateItem
您可以通过以下方式进行:
mwebView.setImageResource(imageArray[position % imageArray.length]);