1. 程式人生 > >ViewPager 無限滑動,往回滑動異常

ViewPager 無限滑動,往回滑動異常

在實現ViewPager的無限滑動時,遇到了個小坑。往前滑動的時候沒有問題,而當我往回滑動的時候程式崩潰掉。

下面的是出現問題的程式碼:

MainActivity.java

public class MainActivity extends Activity {
    private ViewPager viewPager;


    private int []images={R.drawable.slide1,R.drawable.slide2,R.drawable.slide3};


    private List<View> list;
    @Override
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); viewPager = (ViewPager) findViewById(R.id.viewPager); list=new ArrayList<>(); for (int i = 0; i < images.length; i++) { ImageView imageView=new
ImageView(this); imageView.setScaleType(ImageView.ScaleType.CENTER_CROP); imageView.setImageResource(images[i]); list.add(imageView); } MyAdapter adapter=new MyAdapter(list); viewPager.setAdapter(adapter); } }

介面卡 MyAdapter.java

public
class MyAdapter extends PagerAdapter { private List<View> list; public MyAdapter(List<View> list) { this.list = list; } @Override public int getCount() { return Integer.MAX_VALUE; } @Override public boolean isViewFromObject(View view, Object object) { return view == object; } @Override public Object instantiateItem(ViewGroup container, int position) { View view = list.get(position % list.size()); container.addView(view); return view; } @Override public void destroyItem(ViewGroup container, int position, Object object) { container.removeView(list.get(position % list.size())); } }

下面是錯誤提示:

這裡寫圖片描述

程式碼報錯的地方:

這裡寫圖片描述

只需要把:

private int []images={R.drawable.slide1,R.drawable.slide2,R.drawable.slide3};

加上一個圖片資源即可:

private int []images={R.drawable.slide1,R.drawable.slide2,R.drawable.slide3,R.drawable.slide4};

經過分析,因為當viewpager頁面新增的時候,預設是新增3頁(當前顯示頁面,前一頁,和後一頁),當ViewPager往前滑動的時候,比如手機當前顯示的是第1頁(從第0頁開始),這時viewpager裡有第0,1,2三個物件。當viewpager前滑動到第2頁的時候,是先移除第0頁的物件,然後在右邊重複新增第0頁的物件。所以不會出現問題。

而當往回滑動的時候,是先新增再移除。當顯示的頁面處於第2頁的時候,此時在第2頁左右分別新增有第1頁和第0頁,所以當往回滑動的時候,會新增第0頁,但是此時第0頁的物件還在第2頁右邊的容器中,所以會造成第0頁新增不到物件而出錯。