• 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);但是默认不能设置无限页滚动

  • 相关阅读:
    (转)A*算法详解及习题
    BZOJ1444[Jsoi2009]有趣的游戏——AC自动机+概率DP+矩阵乘法
    交通——set+dsu on tree
    [Codeforces1132G]Greedy Subsequences——线段树+单调栈
    BZOJ4482[Jsoi2015]套娃——贪心+set
    BZOJ4477[Jsoi2015]字符串树——可持久化trie树
    BZOJ4475[Jsoi2015]子集选取——递推(结论题)
    [UOJ86]mx的组合数——NTT+数位DP+原根与指标+卢卡斯定理
    BZOJ2428[HAOI2006]均分数据——模拟退火
    BZOJ4712洪水——动态DP+树链剖分+线段树
  • 原文地址:https://www.cnblogs.com/Claire6649/p/5997797.html
Copyright © 2020-2023  润新知