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