• Android笔记之ViewPager实现滑动页面


    1、概述;

    • Viewpager的最大特点就是实现滑动的界面
    • 多个页面的内容可以有两种填充方式:View (普通Activity下),Fragment(V4的Fragmentctivity或者Fragment下)
    • ViewPager的布局最好是在LinearLayout下写

    2、main.xml添加Viewpager组件:

    <android.support.v4.view.ViewPager
            android:id="@+id/Pager"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center" >
        </android.support.v4.view.ViewPager>

    3、主要代码的步骤:

    实例化Viewpager+获得ArrayList作为填充内容+setAdapter(ArrayList....)+新建类extends (FragmentState)PagerAdapter

    +重写适配器的Constructor、getItem、getCount+根据情况决定是否监听onPageChangeListener

    (1)Views作为填充内容:

    private void initViewPager() {
            // TODO Auto-generated method stub
            pager = (ViewPager) findViewById(R.id.Pager);
            LayoutParams params = new LayoutParams(LayoutParams.MATCH_PARENT,
                    LayoutParams.MATCH_PARENT);
            ImageView imaV;
            for (int i = 0; i < ids.length; i++) {
                imaV = new ImageView(this);
                imaV.setImageResource(ids[i]);
    
                imaV.setLayoutParams(params);
                imaV.setScaleType(ScaleType.FIT_XY);
                views.add(imaV);
            }
            pager.setAdapter(new MyAdapter(views));
        }
    public class MyAdapter extends PagerAdapter {
    
        private List<View> views;
    
        public MyAdapter(List<View> views) {
            this.views = views;
        }
    
        //destroyItem,getCount,instantiateItem实现循环滑动
        @Override
        public void destroyItem(View arg0, int arg1, Object arg2) {
            ((ViewPager) arg0).removeView(views.get(arg1 % views.size()));
        }
    
        @Override
        public int getCount() {
            return views.size();
            //向右循环滑动
            //return views.size()*5;
        }
    
        @Override
        public Object instantiateItem(View arg0, int arg1) {
            Log.e("tag", "instantiateItem = " + arg1);
            ((ViewPager) arg0).addView(views.get(arg1 % views.size()), 0);
            return views.get(arg1 % views.size());
        }
    
        @Override
        public boolean isViewFromObject(View arg0, Object arg1) {
            return arg0 == (arg1);
        }
    
    }

    (2)fragment作为填充内容:

    • FragmentActivity或Fragment下
    • fragment_1 extend Fragment
    private ViewPager pager;
    pager = (ViewPager) findViewById(R.id.Pager);
    
            fragmentList.add(new fragment_1());// fragment_1导入v4的包
            fragmentList.add(new fragment_1());
            fragmentList.add(new fragment_1());
            Log.i("size", fragmentList.size() + "");
            MyAdapter myadapter = new MyAdapter(getSupportFragmentManager(),
                    fragmentList);
            pager.setAdapter(myadapter);
    }
    public class MyAdapter extends FragmentStatePagerAdapter {
            List<Fragment> fragmentList;
    
            // 构造函数
            public MyAdapter(FragmentManager fm, List<Fragment> fragmentList) {
                super(fm);
                // TODO Auto-generated constructor stub
                this.fragmentList = fragmentList;
            }
    
            // 重要
            @Override
            public Fragment getItem(int arg0) {
                // TODO Auto-generated method stub
                Log.i("getItem", arg0 + "");
                return (fragmentList == null || fragmentList.size() == 0) ? null
                        : fragmentList.get(arg0);
            }
    
            // 重要
            @Override
            public int getCount() {
                // TODO Auto-generated method stub
                return fragmentList == null ? 0 : fragmentList.size();
            }
        }
    }

    4、决定是否为ViewPager设置监听:每次切换页面的动作

     pager.setOnPageChangeListener(new OnPageChangeListener() {
    
                /**
                 * onPageSelected:每次切换页面就会执行 在此实现圆点指示器以及在最后页面显示button
                 */
                @Override
                public void onPageSelected(int arg0) {
                    // TODO Auto-generated method stub
                }
                /**
                 * 当页面在滑动的时候会调用此方法,在滑动被停止之前,此方法回得到调用。 其中三个参数的含义分别为:
                 * 
                 * arg0 :当前页面,及你点击滑动的页面
                 * 
                 * arg1:当前页面偏移的百分比
                 * 
                 * arg2:当前页面偏移的像素位置
                 */
                @Override
                public void onPageScrolled(int arg0, float arg1, int arg2) {
                    // TODO Auto-generated method stub
                    if (arg0 == views.size() - 1) {
                        Log.i("jump", "NextActivity");
                        startActivity(new Intent().setClass(MainActivity.this,
                                NextActivity.class));
                        finish();
                        Log.i("finished", "MainActivity");
                    }
                }
    
                @Override
                public void onPageScrollStateChanged(int arg0) {
                    // TODO Auto-generated method stub
                }
            });

     5、为ViewPager添加标题

    一般情况下ViewPager在多个页面下都是需要标题来作为指示的

    标题有两种形式:

    (1)使用view.PagerTabStrip 来匹配各个页面:

    main.xml部分:

    <android.support.v4.view.ViewPager
            android:id="@+id/viewPager"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center" >
    
            <android.support.v4.view.PagerTabStrip    
                android:layout_width="wrap_content"    
                android:layout_height="wrap_content"    
                android:layout_gravity="top" />
        </android.support.v4.view.ViewPager>

    代码部分:适配器需要添加private List<String> titleList作为标题字符串集合

    class myPagerAdapter extends FragmentPagerAdapter {
            private List<Fragment> fragmentList;
            private List<String>   titleList;
    
            public myPagerAdapter(FragmentManager fm, List<Fragment> fragmentList, List<String> titleList){
                super(fm);
                this.fragmentList = fragmentList;
                //this.fragmentList为这个类下的变量,右边的fragmentList是构造函数的参数
                this.titleList = titleList;
            }
    .........
    public CharSequence getPageTitle(int position) {
                return (titleList.size() > position) ? titleList.get(position) : "";
            }
     

    (2)监听onPageChanggeListener改变Textiew或RadioGroup的状态:

    • Textiew,Radioroup的触碰效果通过selector实现
    • 按textView、RadioGroup改变页面,通过对其setOnClickListener实现
    • 页面滑动改变对应按钮的改变通过Viewpager的监听
    • 附加:图片指示器的实现只需在Viewpager监听实现

    Done!

  • 相关阅读:
    WinSCP命令行操作
    Android SDK platforms build-tools等镜像下载
    Ubuntu 18.04 下配置 HAXM 加速 Android模拟器
    HDU 2222 Keywords Search
    获取Android自己写好了的apk以及反编译
    Linux下几个常用的快捷键,真的很实用
    Android项目实战--手机卫士18--读取用户的短信内容以及短信备份
    高仿“点触验证码”做的一个静态Html例子
    我的华为面试经历——技术服务
    数据库日期类型转换–HSQL
  • 原文地址:https://www.cnblogs.com/xingyyy/p/3337595.html
Copyright © 2020-2023  润新知