android实现ViewPager的左右滑动效果


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

     

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM