Android之viewpager. PagerAdapter destroyItem报错

在使用viewpager时,我们常常需要更新页面数据,处理不当会导致数组越界,从而引起页面崩溃。

如图:页面只有一个viewpager,父系一共有10页数据,“母系”只有一页数据。初始化时使用“父系”数据填充,当点击“母系”时,会请求服务器返回数据,从而更新viewpage数据源。当“父系”时滑动到第5页,这时候请求“母系”数据,请求数据后更新viewpager时PagerAdapter的destroyItem报错报错: java.lang.IndexOutOfBoundsException: Invalid index.....

Android之viewpager. PagerAdapter destroyItem报错_第1张图片

 

源码:

private ScrollViewPager viewPager;
private List 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);
}

 

 

你可能感兴趣的:(Android)