在實現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后運行,即可實現無限左右滑動了。
