在实现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后运行,即可实现无限左右滑动了。