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