在使用viewpager时,我们常常需要更新页面数据,处理不当会导致数组越界,从而引起页面崩溃。
如图:页面只有一个viewpager,父系一共有10页数据,“母系”只有一页数据。初始化时使用“父系”数据填充,当点击“母系”时,会请求服务器返回数据,从而更新viewpage数据源。当“父系”时滑动到第5页,这时候请求“母系”数据,请求数据后更新viewpager时PagerAdapter的destroyItem报错报错: java.lang.IndexOutOfBoundsException: Invalid index.....
源码:
private ScrollViewPager viewPager;
private List<View> mViewList;
viewPager = (ScrollViewPager) getView().findViewById(R.id.viewpager);
mViewList = new ArrayList<>();
for (int i = 0; i < pageAmount; i++) {
View viewItem = LayoutInflater.from(getContext()).inflate(R.layout.layout_cepu, null);
// 页面数据赋值。。。。。。
mViewList.add(viewItem);
}
viewPager.setAdapter(mCycylePagerAdapter);
private PagerAdapter mCycylePagerAdapter = new PagerAdapter() {
@Override
public int getCount() {
return pageAmount; // 返回viewpager页面的个数
}
//设置viewpage内部东西的方法,如果viewpage内没有子空间滑动产生不了动画效果
@Override
public Object instantiateItem(ViewGroup container, int position) {
container.addView(mViewList.get(position));
//最后要返回的是控件本身
return mViewList.get(position);
}
// 加入页面的时候,系统默认缓存三个,滑动的图片超出了缓存的范围,需要在此将图片销毁。如不做处理,滑多了程序就会蹦
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView(mViewList.get(position));
}
//判断是否是否为同一张图片,这里返回方法中的两个参数做比较就可以
@Override
public boolean isViewFromObject(View view, Object object) {
return view == object;
}
};
修改方法:
方法1:在切换Tab按钮时,把viewPager.setCurrentItem(0);
方法2:修改adapter方法container.removeView(mViewList.get(position)); 改成
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView((View) object);
}