Android ViewPager PagerAdapter 圖片輪播


  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下建立選擇器

point_selector.xml 
 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>
activity_main.xml
  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 }
MainActivity.java

 

 下面是使用

  android.support.design.widget.TabLayout的效果,需要導入jar studio可以遠程依賴

  在布局中添加TabLayout
  在viewPager設置適配器后,調用setupWithViewPager(vp);但是默認不能設置無限頁滾動

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM