ViewPager 無限滑動,往回滑動異常
阿新 • • 發佈:2019-01-04
在實現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頁新增不到物件而出錯。