在實現ViewPager的左右滑動效果時,出現了拋出IllegalStateException異常的問題,以及向左滑動時圖片會顯示空白的問題。經過反復試驗后,終於實現了左右滑動的效果,總結了一些經驗,分享給大家,遇到類似問題可以作為參考。
一、首先我們ViewPager實現3個圖片的滑動效果,此時不能實現無限滑動的效果。
1.在activity_main的布局文件中加入ViewPager的布局,如下:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.v4.view.ViewPager android:id="@+id/fragmentviewpager" android:layout_width="match_parent" android:layout_height="wrap_content"/>
</RelativeLayout>
2.創建ViewPager的適配器類ViewPagerAdapter,具體代碼如下:
public class ViewPagerAdapter extends PagerAdapter { private List<View> listView; @Override public Object instantiateItem(ViewGroup container, int position) { container.addView(listView.get(position)); return listView.get(position); } @Override public void destroyItem(ViewGroup container, int position, Object object) { container.removeView(listView.get(position)); } public ViewPagerAdapter(List<View> listView){super(); this.listView=listView; } @Override public int getCount() { return listView.size(); } @Override public boolean isViewFromObject(View view, Object object) { return view==object; } }
3.創建Activity類,具體代碼如下:
public class MainActivity extends Activity { private Button welcome_btn; private ViewPager pager; private List<View> list; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); initViewPager(); } //初始化ViewPager的方法 public void initViewPager() { ImageView iv1 = new ImageView(this); iv1.setImageResource(R.drawable.guide_01); ImageView iv2 = new ImageView(this); iv2.setImageResource(R.drawable.guide_02); ImageView iv3 = new ImageView(this); iv3.setImageResource(R.drawable.guide_03); list=new ArrayList<View>(); list.add(iv1); list.add(iv2); list.add(iv3); pager=(ViewPager)findViewById(R.id.welcome_pager); pager.setAdapter(new ViewPagerAdapter(list)); //監聽ViewPager滑動效果 pager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageSelected(int arg0) { } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { } @Override public void onPageScrollStateChanged(int arg0) { } }); } }
至此可以實現3張圖片的左右滑動。如有希望實現無限左右滑動,需要更改一下代碼。
1)在pager添加適配器的代碼后面增加一行代碼:
pager.setAdapter(new ViewPagerAdapter(list));
變為
pager.setAdapter(new ViewPagerAdapter(list));
viewPager.setCurrentItem(300);
意思是讓viewPager從第300個開始顯示,那么開始就能向左滑動(左邊不是負數了)。
2.將inistantiateItem方法中position替換為position%list.size(),同時在getCount()方法中返回整數的最大值Integer.MAX_VALUE,即總共展示了MAX_VALUE個項,從第300個項開始展示。
3.更改后因拋出IllegalStateException異常,顯示子類已經有父類,無法被container添加。所以加了一個判斷,即先得到父類,再判斷父類是否為空,如果不為空,就removeView,讓子類和父類分開,並重新addView,即:
View v= list.get(position%list.size()); ViewPager parent=(ViewPager)v.getParent(); if(parent!=null){ parent.removeView(v); } container.addView(v); return v;
4.此時發現向左滑動時,顯示為空白,原因是:由於我們在instantiateItem()方法里已經處理了remove的邏輯,所以在destroyItem方法中我們不需要再remove了,所以去掉了destroyItem方法中的
//container.removeView(list.get(position%list.size()));
綜上所述,更改適配器類如下:
public class MyViewPagerAdapter extends PagerAdapter { private List<View> list; public MyViewPagerAdapter(List<View> list) { super(); this.list=list; } @Override public Object instantiateItem(ViewGroup container, int position) { View v= list.get(position%list.size()); ViewPager parent=(ViewPager)v.getParent(); if(parent!=null){ parent.removeView(v); } container.addView(v); return v; } @Override public void destroyItem(ViewGroup container, int position, Object object) { //container.removeView(list.get(position%list.size())); } @Override public int getCount() { return Integer.MAX_VALUE; } @Override public boolean isViewFromObject(View view, Object object) { return view==object; } }
重新安裝apk后運行,即可實現無限左右滑動了。