ViewPager類直接繼承了ViewGroup類,所有它是一個容器類,可以在其中添加其他的View類。
ViewPager類需要一個PagerAdapter適配器類給它提供數據。
ViewPager經常和Fragment一起使用,並且提供了專門的FragmentPagerAdapter和FragmentStatePagerAdapter類供Fragment中的ViewPager使用。
ViewPager的功能就是可以使視圖滑動,就像Lanucher左右滑動那樣。分三個步驟來使用它:
1.在住布局文件里加入
2.加載要顯示的頁卡
3.在Activity里實例化ViewPager組件,並設置它的Adapter(就是PagerAdapter,方法與ListView一樣的),在這里一般需要重寫PagerAdapter。
當你實現一個PagerAdapter,你必須至少覆蓋以下方法:
1. instantiateItem(ViewGroup, int) //返回視圖對象
2. destroyItem(ViewGroup, int, Object) //銷毀視圖對象
3. getCount() //視圖個數
4. isViewFromObject(View, Object) //一般傳入arg0==arg1.用來判斷兩個視圖是否是等價的
XML配置
<android.support.v4.view.ViewPager
android:id="@+id/viewpager"
android:layout_width="wrap_content"
android:layout_height="wrap_content" >
</android.support.v4.view.ViewPager>
在res/drawable下建立選擇器


1 <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 2 android:id="@+id/activity_main" 3 android:layout_width="match_parent" 4 android:layout_height="match_parent"> 5 6 <LinearLayout 7 android:layout_width="match_parent" 8 android:layout_height="wrap_content" 9 android:orientation="vertical"> 10 <!-- <android.support.design.widget.TabLayout 11 android:id="@+id/tablelayout" 12 android:layout_width="match_parent" 13 android:layout_height="wrap_content" />--> 14 15 16 <android.support.v4.view.ViewPager 17 android:id="@+id/viewPager" 18 android:layout_width="match_parent" 19 android:layout_height="match_parent"> 20 <!--系統默認PagerTabStrip和PagerTabStrip指示器的唯一區別是 21 PagerTabStrip可以點,PagerTabStrip不能點--> 22 <android.support.v4.view.PagerTabStrip 23 android:id="@+id/pts" 24 android:layout_width="match_parent" 25 android:layout_height="wrap_content"> 26 27 </android.support.v4.view.PagerTabStrip> 28 29 </android.support.v4.view.ViewPager> 30 </LinearLayout> 31 <LinearLayout 32 android:id="@+id/ll_points" 33 android:layout_width="wrap_content" 34 android:layout_height="wrap_content" 35 android:orientation="horizontal" 36 android:layout_alignParentBottom="true" 37 android:layout_marginBottom="50dp" 38 android:layout_centerHorizontal="true"> 39 40 </LinearLayout> 41 </RelativeLayout>

1 public class MainActivity extends AppCompatActivity { 2 3 ViewPager viewPager; 4 Timer timer; 5 LinearLayout ll_points; 6 //TabLayout tablayout; 7 8 @Override 9 protected void onCreate(Bundle savedInstanceState) { 10 super.onCreate(savedInstanceState); 11 setContentView(R.layout.activity_main); 12 13 viewPager = (ViewPager) findViewById(R.id.viewPager); 14 initPoints(); 15 16 //tablayout = (TabLayout) findViewById(R.id.tablayout); 17 18 viewPager.setAdapter(new MyPagerAdapter()); 19 20 //指示器也需要在設置適配器之后,還有默認不能設置成無限滾動,所以 21 //tablayout.setupWithViewPager(viewPager); 22 23 //必須在設置適配器之后設置默認中間頁 24 //viewPager.setCurrentItem(Integer.MAX_VALUE / 2); 25 26 viewPager.setCurrentItem(Integer.MAX_VALUE / 2 - Integer.MAX_VALUE / 2 % 6); 27 //viewPager.setCurrentItem(0); 28 //設置自動輪播 29 startAuto(); 30 31 viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { 32 @Override 33 public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { 34 //無限頁 35 } 36 37 int currentIndex = 0;//一開始是第0頁,已經被選中 38 @Override 39 public void onPageSelected(int position) { 40 //頁面選擇時 41 Toast.makeText(MainActivity.this,position+"頁",Toast.LENGTH_SHORT).show(); 42 ll_points.getChildAt(currentIndex).setSelected(false); 43 ll_points.getChildAt(position % 6).setSelected(true); 44 currentIndex = position % 6; 45 } 46 47 @Override 48 public void onPageScrollStateChanged(int state) { 49 //狀態改變 50 if (state == ViewPager.SCROLL_STATE_DRAGGING) { 51 //停止自動滾動 52 } else { 53 //開始滾動 54 } 55 } 56 }); 57 58 } 59 60 private void initPoints() { 61 ll_points = (LinearLayout) findViewById(R.id.ll_points); 62 for (int i = 0; i < 6; i++) { 63 View view = new View(getBaseContext()); 64 LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(20,20); 65 params.setMargins(10,10,10,10); 66 view.setBackgroundResource(R.drawable.point_selector); 67 view.setLayoutParams(params); 68 ll_points.addView(view); 69 } 70 71 //默認第0個被選中 72 ll_points.getChildAt(0).setSelected(true); 73 74 } 75 76 public void startAuto(){ 77 //計時器 78 timer = new Timer(); 79 timer.schedule(new TimerTask() { 80 @Override 81 public void run() { 82 //修改UI子線程中修改 83 runOnUiThread(new Runnable() { 84 @Override 85 public void run() { 86 viewPager.setCurrentItem(viewPager.getCurrentItem()+1); 87 } 88 }); 89 90 } 91 }, 3000, 3000); 92 } 93 94 public void stop(){ 95 if(timer != null){ 96 timer.cancel(); 97 } 98 } 99 100 class MyPagerAdapter extends PagerAdapter { 101 //每一個ViewPager就是一個頁面 102 List<View> mList = new ArrayList<>(); 103 int[] imgId = new int[]{R.mipmap.img01, R.mipmap.img02, R.mipmap.img03, R.mipmap.img04, R.mipmap.img05, R.mipmap.img06}; 104 105 public MyPagerAdapter(){ 106 for(int i=0; i<6; i++){ 107 ImageView img = new ImageView(getBaseContext()); 108 img.setImageResource(imgId[i]); 109 img.setScaleType(ImageView.ScaleType.FIT_XY); 110 mList.add(img); 111 } 112 } 113 @Override 114 public int getCount() { 115 //return mList.size(); 116 //輪播設置最大值 117 return Integer.MAX_VALUE; 118 } 119 120 @Override 121 public boolean isViewFromObject(View view, Object object) { 122 //判斷兩頁是否相同,google要求這樣寫 123 return view == object; 124 } 125 126 //加載視圖對象,不要弄成View container的函數,這個已經是過期的了 127 @Override 128 public Object instantiateItem(ViewGroup container, int position) { 129 //添加視圖到ViewGroup中 130 container.addView(mList.get(position % 6)); 131 return mList.get(position % 6); 132 } 133 134 //銷毀一個視圖 135 @Override 136 public void destroyItem(ViewGroup container, int position, Object object) { 137 container.removeView(mList.get(position % 6)); 138 } 139 140 String[] titles = {"第一頁","第二頁","第三頁","第四頁","第五頁","第六頁"}; 141 142 //給定系統的指示器的時候,需要重寫getPageTitle方法 143 @Override 144 public CharSequence getPageTitle(int position) { 145 return titles[position % 6]; 146 } 147 } 148 149 }
下面是使用
android.support.design.widget.TabLayout的效果,需要導入jar studio可以遠程依賴
在布局中添加TabLayout
在viewPager設置適配器后,調用setupWithViewPager(vp);但是默認不能設置無限頁滾動