Android之viewpager. PagerAdapter destroyItem報錯

lvxiangan發表於2018-09-14

在使用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);
}

 

 

相關文章