ViewPager(二)

需要ViewPager托管非fragment视图时,就需要实现原生PagerAdapter接口,比如托管图片
要实现PagerAdapter接口,则需要了解ViewPager-PagerAdapter和RecyclerView-Adapter各自关系的异同
PagerAdapter不使用可返回视图的onBindViewHolder方法,而使用以下方法

public Object instantiateItem(ViewGroup container,int position)
public void destroyItem(ViewGroup container,int position,Object object)
public abstract boolean isViewFromObject(View view,Object object)

方法一:创建指定位置的列表项视图,然后将其添加给ViewGroup视图容器。并不要求立即创建视图,PagerAdapter可自行决定何时创建视图
方法二:销毁已建视图
方法三:判断pager的一个view是否和instantiateItem返回的object匹配
贴一下网上搜到的答案网址:https://segmentfault.com/q/1010000000484617

前提概念:
ViewPager里面对每个页面的管理是key-value形式的,也就是说每个page都有个对应的id(id是object类型),需要对page操作的时候都是通过id来完成的
首先看这个函数
public Object instantiateItem(ViewGroup container, int position);
这是pageAdapter里的函数,功能就是往PageView里添加自己需要的page。同时注意它还有个返回值object,这就是那个id。
最后
public abstract boolean isViewFromObject (View view, Object object)
这个函数就是用来告诉框架,这个view的id是不是这个object。
谷歌官方推荐把view当id用,所以常规的instantiateItem()函数的返回值是你自己定义的view,而isViewFromObject()的返回值是view == object。
ps:感觉这个机制应该是历史遗留问题,属于改bug改出来的机制。否则官方不会推荐这种把view当id的做法

用ViewPager来实现应用的引导页

//初始化引导页数据
//本例中引导页有四张图片
    private void initGuideDate()
    {
        mImageIds=new ArrayList<>();
        mImageIds.add(R.drawable.guide_1);
        mImageIds.add(R.drawable.guide_2);
        mImageIds.add(R.drawable.guide_3);
        mImageIds.add(R.drawable.guide_4);
    }
//初始化引导页布局
//用四个ImageView来装这四张图片
    private void initGuideView()
    {
        mImageViews=new ArrayList<>();
        for(int i=0;i

    //初始化ViewPager
    //并且为其添加监听事件实现滑动最后一页一定距离时跳转到登录页
    private void initViewPager()
    {
        mViewPager=(ViewPager)findViewById(R.id.view_pager);
        mViewPager.setAdapter(new GuideAdapter());
        mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }
            @Override
            public void onPageSelected(int position) {
                currentItem=position;
            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });

        mViewPager.setOnTouchListener(new View.OnTouchListener() {
            float startX;
            float startY;
            float endX;
            float endY;
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                switch(event.getAction()){
                    case MotionEvent.ACTION_DOWN:
                        startX=event.getX();
                        startY=event.getY();
                        break;
                    case MotionEvent.ACTION_UP:
                        endX=event.getX();
                        endY=event.getY();
                        //获取屏幕长度
                        WindowManager windowManager=(WindowManager)getApplicationContext().getSystemService(Context.WINDOW_SERVICE);
                        Point size=new Point();
                        windowManager.getDefaultDisplay().getSize(size);
                        int width=size.x;
                        //首先确定是否到了最后一页,在判断滑动距离是否符合
                        if((currentItem==(mImageIds.size()-1))&&(startX-endX>0)&&(startX-endX>(width/4)))
                        {
                            Intent intent=LoginActivity.newIntent(GuideActivity.this);
                            startActivity(intent);
                            finish();
                        }
                        break;
                }
                return false;
            }
        });

    }
private class GuideAdapter extends PagerAdapter
    {
        @Override
        public int getCount()
        {
            return mImageViews.size();
        }

        //判断当前分页是不是view,因为ViewPager的分页可以填入Fragment
        @Override
        public boolean isViewFromObject(View view,Object object)
        {
            return view==object;
        }

        //清理内存,释放滑过的页的内存
        @Override
        public void destroyItem(ViewGroup container,int position,Object object)
        {
            container.removeView(mImageViews.get(position));
        }

        //初始化分页
        @Override
        public Object instantiateItem(ViewGroup container,int position)
        {
            ImageView imageView=mImageViews.get(position);
            imageView.setImageResource(mImageIds.get(position));
            container.addView(imageView);
            return imageView;
        }


    }

你可能感兴趣的:(ViewPager(二))