zoukankan      html  css  js  c++  java
  • 【幻化万千戏红尘】qianfeng-Android-Day17_ViewPager

    ViewPager

    一、ViewPager简介:

    (一)、作用:

    ViewPager的功能就是可以使视图滑动,就像Lanucher左右滑动那样。ViewPager用于实现多页面的切换效果。该类存在于Google的兼容包里面,android.support.v4.view.ViewPager

    (二)、ViewPager的常规使用步骤

    1、在布局文件中定义ViewPager组件(android.support.v4.view.ViewPager节点);

    2、在Activity中设置ViewPager中放置的view内容;

    3、给ViewPager对象设置适配器(PagerAdapter)。

    1. ViewPager的适配器是PagerAdapter,它是基类。提供适配器来填充ViewPager的内部。一般做法都是继承PagerAdapter,自定义一个MyAdapter
    2. 也可以使用一个更具体的实现,FragmentPagerAdapterFragmentStatePagerAdapter。谷歌官方推荐ViewPagerFragment一起使用。当然在3.0以下版本中,没有必要这么做。

    (三)、实现PagerAdapter必须重写的方法:

    1getCount()

    2isViewFromObject(View, Object)

    3instantiateItem(ViewGroup, int)

    4destroyItem(ViewGroup, int, Object)

    【备注:】最少要实现上面四个方法,当然如果想让程序更健壮或是功能更全面,你可以重写其他的方法。

    ViewPager实现广告条实例

    (一Adapter核心代码

    public class MyAdapter extends PagerAdapter {

        private static final String TAG = "viewpager";

        private List<ImageView> list;

        public MyAdapter(List<ImageView> list) {

            this.list = list;

        }

        //返回ViewPager中item的总量

        @Override

        public int getCount() {

            //设置item的数量为Integer.MAX_VALUE

            return Integer.MAX_VALUE;

        }

        //判断当前显示的ImageView和instantiateItem方法返回的ImageView是否是同一个

        @Override

        public boolean isViewFromObject(View view, Object object) {

            return view == object;

        }

        //添加ImageView到ViewPager中

        @Override

        public Object instantiateItem(ViewGroup container, int position) {

            //根据position将List中的ImageView添加到ViewPager中

            container.addView(list.get(position%list.size()));

            Log.d(TAG, "instantiateItem() returned: " + position);

            //将添加的ImageView返回

            return list.get(position%list.size());

        }

        @Override

        public void destroyItem(ViewGroup container, int position, Object object) {

            //从容器中移除一个ImageView

            container.removeView(list.get(position%list.size()));

            Log.d(TAG, "destroyItem() returned: " + position);

        }

    }

    (二MainActivity核心代码:

    public class MainActivity extends AppCompatActivity {

        private List<ImageView> list;

        private LinearLayout dotLayout;

        private int prePosition;

        private ViewPager viewPager;

        @Override

        protected void onCreate(Bundle savedInstanceState) {

            super.onCreate(savedInstanceState);

            setContentView(R.layout.activity_main);

            initData();

            initView();

            //开启一个新线程,实现ViewPager的自动滚动

            new Thread(new Runnable() {

                @Override

                public void run() {

                    while (true) {

                        try {

                            Thread.sleep(3000);

                        } catch (InterruptedException e) {

                            e.printStackTrace();

                        }

                        //runOnUiThread中的代码运行在主线程中

                        runOnUiThread(new Runnable() {

                            @Override

                            public void run() {

                                viewPager.setCurrentItem(viewPager.getCurrentItem() + 1);

                            }

                        });

                    }

                }

            }).start();

        }

        private void initView() {

            viewPager = (ViewPager) findViewById(R.id.vp1);

            //构造适配器

            MyAdapter adapter = new MyAdapter(list);

            //设置Adapter

            viewPager.setAdapter(adapter);

            //设置ViewPager预加载的页数

    //        viewPager.setOffscreenPageLimit(2);

            viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {

                //ViewPager滑动过程中调用

                @Override

                public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

                }

                //ViewPager新页面确定后调用

                @Override

                public void onPageSelected(int position) {

                    //设置前一个View为白色

                    dotLayout.getChildAt(prePosition).setEnabled(false);

                    //设置当前View为红色

                    dotLayout.getChildAt(position % list.size()).setEnabled(true);

                    //将当前位置赋给prePosition

                    prePosition = position % list.size();

                }

                //ViewPager滑动状态改变后调用

                //0--静止状态

                //1--手在拖动

                //2--手松开后自动滑动

                @Override

                public void onPageScrollStateChanged(int state) {

                }

            });

            //设置ViewPager的初始item

            viewPager.setCurrentItem(Integer.MAX_VALUE / 2 - 3);

        }

        /**

         * 构造数据源

         */

        private void initData() {

            dotLayout = (LinearLayout) findViewById(R.id.dotLayout);

            list = new ArrayList<>();

            int[] imgs = new int[]{R.drawable.p001, R.drawable.p002, R.drawable.p003, R.drawable.p004, R.drawable.p005};

            for (int img : imgs) {

                //使用Java代码创建一个ImageView

                ImageView imageView = new ImageView(this);

                //设置图片以及ScaleType属性

                imageView.setImageResource(img);

                imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);

                list.add(imageView);

                //创建一个View对象

                View view = new View(this);

                //设置View的宽和高

                LinearLayout.LayoutParams params = new LinearLayout.LayoutParams((int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 8, getResources().getDisplayMetrics()), (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 8, getResources().getDisplayMetrics()));

                //设置View左边距,避免View连在一起

                params.leftMargin = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 12, getResources().getDisplayMetrics());

                view.setLayoutParams(params);

                //设置背景颜色,背景使用selector,可使View在不同状态显示不同颜色

                view.setBackgroundResource(R.drawable.dot_backg);

                //默认状态下View的Enable属性为false(View全为白色)

                view.setEnabled(false);

                //将View添加进LinearLayout中

                dotLayout.addView(view);

            }

            //第一个View默认为红色

            dotLayout.getChildAt(0).setEnabled(true);

        }

    }

    ViewPager加载Fragment实例:

    (一Adapter核心代码:

    public class MyFgAdapter extends FragmentPagerAdapter {

        private List<Fragment> list;

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

            super(fm);

            this.list = list;

        }

        //返回一个Fragment

        @Override

        public Fragment getItem(int position) {

            return list.get(position);

        }

        //返回Fragment总数

        @Override

        public int getCount() {

            return list.size();

        }

    }

    (二Activity核心代码

    public class MainActivity extends AppCompatActivity {

        private List<Fragment> list;

        @Override

        protected void onCreate(Bundle savedInstanceState) {

            super.onCreate(savedInstanceState);

            setContentView(R.layout.activity_main);

            getSharedPreferences("loginInfo", MODE_PRIVATE).edit().putBoolean("isFirstLogin", false).commit();

            ViewPager viewPager = (ViewPager) findViewById(R.id.vp);

            initData();

            MyFgAdapter adapter = new MyFgAdapter(getSupportFragmentManager(), list);

            viewPager.setAdapter(adapter);

        }

        private void initData() {

            list = new ArrayList<>();

            ChatFragment chatFragment = new ChatFragment();

            FriendFragment friendFragment = new FriendFragment();

            FindFragment findFragment = new FindFragment();

            HomeFragment homeFragment = new HomeFragment();

            list.add(chatFragment);

            list.add(friendFragment);

            list.add(findFragment);

            list.add(homeFragment);

        }

    }

  • 相关阅读:
    poj 3528 (三维几何求凸包+凸包表面积)
    dijkstra模板(好像是斐波那契额堆优化,但我为什么看起来像优先队列优化,和spfa一样)
    最大空凸包模板
    ICPC 2017–2018, NEERC, Northern Subregional Contest St Petersburg, November 4, 2017 I题
    hdu 5248 序列变换
    hdu 2063(二分图模板测试)
    组合数
    85. Maximal Rectangle 由1拼出的最大矩形
    750. Number Of Corner Rectangles四周是点的矩形个数
    801. Minimum Swaps To Make Sequences Increasing 为使两个数组严格递增,所需要的最小交换次数
  • 原文地址:https://www.cnblogs.com/weigongcheng/p/5886445.html
Copyright © 2011-2022 走看看