1. 程式人生 > >Android下ViewPager的FragmentPagerAdapter 使用

Android下ViewPager的FragmentPagerAdapter 使用

自己的

package com.mad.trafficclient.adapter;

import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentPagerAdapter;

import java.util.ArrayList;

/**
 * 建立者:cc
 * 建立時間:2018/9/3 15:45
 * 修改時間:
 * 修改備註:
 * 描述:  ViewPager載入Fragment時候使用  viewPager的PagerAdapter介面卡
 */
public class fg7_FragementAdapter extends FragmentPagerAdapter{

    private FragmentManager fragmentManager;
    private ArrayList<Fragment> list;

    public fg7_FragementAdapter(FragmentManager fm, ArrayList<Fragment> list) {
        super(fm);
        this.fragmentManager = fm;
        this.list = list;

    }

    @Override//返回要顯示的碎片
    public Fragment getItem(int position) {
        return list.get(position);
    }

    @Override//返回要顯示多少頁
    public int getCount() {
        return list.size();
    }
}

呼叫:

public class fg7_GRZX extends FragmentHome {

    private TextView fg7_tv_personal;
    private TextView fg7_tv_CZjl;
    private TextView fg7_tv_etc_set;
    private ViewPager fg7_viewpager;
    private ArrayList<Fragment> fragmentslist;
    private fg7_FragementAdapter adapter;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.fg7__grzx, container, false);

        return view;
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);

        initView();//找到控制元件

    }

    private void initView() {
        fg7_tv_personal = (TextView) getActivity().findViewById(R.id.fg7_tv_personal);
        fg7_tv_CZjl = (TextView) getActivity().findViewById(R.id.fg7_tv_CZjl);
        fg7_tv_etc_set = (TextView) getActivity().findViewById(R.id.fg7_tv_etc_set);
        fg7_viewpager = (ViewPager) getActivity().findViewById(R.id.fg7_viewpager1);


        fragmentslist = new ArrayList<>();
        initData();

    }


    private void initData() {

        //新增Fragment物件新增到Fragment集合中
        PerInfoFragment perInfoFragment = new PerInfoFragment();
        fragmentslist.add(perInfoFragment);
        CZjlFragment cZjlFragment = new CZjlFragment();
        fragmentslist.add(cZjlFragment);
        Etcset_Fragment etcset_fragment = new Etcset_Fragment();
        fragmentslist.add(etcset_fragment);

        adapter = new fg7_FragementAdapter(getChildFragmentManager(), fragmentslist);
        fg7_viewpager.setAdapter(adapter);

        fg7_viewpager.setCurrentItem(0);
        //當頁面發生改變的時候
        fg7_viewpager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }

            @Override
            public void onPageSelected(int position) {

            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });

        //點選Text改變page
        fg7_tv_personal.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                fg7_viewpager.setCurrentItem(0);
            }
        });

        fg7_tv_CZjl.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                fg7_viewpager.setCurrentItem(1);
            }
        });

        fg7_tv_etc_set.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                fg7_viewpager.setCurrentItem(2);
            }
        });

    }


}

網上找的一些

新建一個android專案

先展示效果吧

首先看myfragmentPagerAdater這個類的程式碼

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

package

com.example.viewpager;

import java.util.List;

import android.support.v4.app.Fragment;   //注意打包是用support.v4的

import android.support.v4.app.FragmentManager;

import android.support.v4.app.FragmentPagerAdapter;

<br>//繼承

public class myFragmentPagerAdapter extends FragmentPagerAdapter {

private FragmentManager fragmetnmanager;  //建立FragmentManager

private List<Fragment> listfragment; //建立一個List<Fragment>

<br>      //定義構造帶兩個引數

public myFragmentPagerAdapter(FragmentManager fm,List<Fragment> list) {

super(fm);

this.fragmetnmanager=fm;

this.listfragment=list;

}

@Override

public Fragment getItem(int arg0) {

// TODO Auto-generated method stub

return listfragment.get(arg0); //返回第幾個fragment

}

@Override

public int getCount() {

// TODO Auto-generated method stub

return listfragment.size(); //總共有多少個fragment

}

}

然後到MainActivity初始化ViewPager  (這裡還沒有圖片偏移和連結點選事件的程式碼 後面講到)

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

/*

* 初始化Viewpager<br>     *

*/

viewpager=(ViewPager) findViewById(R.id.vp); //獲取ViewPager

listfragment=new ArrayList<Fragment>(); //new一個List<Fragment>

Fragment f1 = new fragment01();

Fragment f2 = new fragment02();

Fragment f3 = new fragment03();<br>     //新增三個fragment到集合

listfragment.add(f1);

listfragment.add(f2);

listfragment.add(f3);

FragmentManager fm=getSupportFragmentManager();

myFragmentPagerAdapter mfpa=new myFragmentPagerAdapter(fm, listfragment); //new myFragmentPagerAdater記得帶上兩個引數

viewpager.setAdapter(mfpa);

viewpager.setCurrentItem(0); //設定當前頁是第一頁

  現在到MainActivity中的三個連結的點選程式碼(這三個是TextView來著)之後就可以點選實現頁面調轉,但是圖片偏移還沒實現

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

/*

* 初始化連結

*/

t1=(TextView) findViewById(R.id.textView1);

t2=(TextView) findViewById(R.id.textView2);

t3=(TextView) findViewById(R.id.textView3);

t1.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

viewpager.setCurrentItem(0);

}

});

t2.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

viewpager.setCurrentItem(1);

}

});

t3.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

viewpager.setCurrentItem(2);

}

});

然後是圖片偏移

1

2

3

private int index; //當前頁卡;

private int imgleth; //圖片寬度

private int offset; //偏移量

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

/*

* 初始化圖片

*/

iv=(ImageView) findViewById(R.id.imageView1);

//獲取圖片寬度

imgleth=BitmapFactory.decodeResource(getResources(), R.drawable.a1).getWidth();

//獲取螢幕寬度

DisplayMetrics dm=new DisplayMetrics();

// 把螢幕尺寸資訊賦值給DisplayMetrics dm,注意不是set

getWindowManager().getDefaultDisplay().getMetrics(dm);

// 螢幕寬度

int count=dm.widthPixels;

//計算偏移量

offset=(count/3-imgleth)/2;

//平移動畫(第一頁的)

Animation  an=new TranslateAnimation(0, offset, 0, 0);

an.setFillAfter(true);

an.setDuration(200);

iv.setAnimation(an);

 最後是偏移圖片跟著頁面走 只需要在之前的 viewpager.setCurrentItem(0);後面新增即可

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

viewpager.setOnPageChangeListener(new OnPageChangeListener() {

int one=offset*2+imgleth;//相鄰頁面的偏移量

@Override

public void onPageSelected(int arg0) {

//評議動畫

Animation anima=new TranslateAnimation(index*one+offset,arg0*one+offset,0,0);

index=arg0; //當前頁跟著變

anima.setFillAfter(true); // 動畫終止時停留在最後一幀,不然會回到沒有執行前的狀態

anima.setDuration(200);// 動畫持續時間0.2秒

iv.startAnimation(anima);// 是用ImageView來顯示動畫的

Toast.makeText(MainActivity.this, "您選擇了第"+(index+1)+"個頁卡", 100).show(); 

}

@Override

public void onPageScrolled(int arg0, float arg1, int arg2) {

// TODO Auto-generated method stub

}

@Override

public void onPageScrollStateChanged(int arg0) {

// TODO Auto-generated method stub

}

});

特別注意打包時候是打v4包(每個fragment也是打v4包)

1

2

3

4

5

import android.support.v4.app.Fragment;

import android.support.v4.app.FragmentActivity;

import android.support.v4.app.FragmentManager;

import android.support.v4.view.ViewPager;

import android.support.v4.view.ViewPager.OnPageChangeListener;

TranslateAnimation引數說明: 

float fromXDelta:這個引數表示動畫開始的點離當前View X座標上的差值;

float toXDelta, 這個引數表示動畫結束的點離當前View X座標上的差值;

float fromYDelta, 這個引數表示動畫開始的點離當前View Y座標上的差值;

float toYDelta, 這個引數表示動畫開始的點離當前View Y座標上的差值;

這4個引數確定移動的起點和終點