ViewPager(二)

需要ViewPager托管非fragment視圖時(shí),就需要實(shí)現(xiàn)原生PagerAdapter接口,比如托管圖片
要實(shí)現(xiàn)PagerAdapter接口,則需要了解ViewPager-PagerAdapter和RecyclerView-Adapter各自關(guān)系的異同
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)

方法一:創(chuàng)建指定位置的列表項(xiàng)視圖,然后將其添加給ViewGroup視圖容器。并不要求立即創(chuàng)建視圖,PagerAdapter可自行決定何時(shí)創(chuàng)建視圖
方法二:銷毀已建視圖
方法三:判斷pager的一個(gè)view是否和instantiateItem返回的object匹配
貼一下網(wǎng)上搜到的答案網(wǎng)址:https://segmentfault.com/q/1010000000484617

前提概念:
ViewPager里面對(duì)每個(gè)頁(yè)面的管理是key-value形式的,也就是說(shuō)每個(gè)page都有個(gè)對(duì)應(yīng)的id(id是object類型),需要對(duì)page操作的時(shí)候都是通過(guò)id來(lái)完成的
首先看這個(gè)函數(shù)
public Object instantiateItem(ViewGroup container, int position);
這是pageAdapter里的函數(shù),功能就是往PageView里添加自己需要的page。同時(shí)注意它還有個(gè)返回值object,這就是那個(gè)id。
最后
public abstract boolean isViewFromObject (View view, Object object)
這個(gè)函數(shù)就是用來(lái)告訴框架,這個(gè)view的id是不是這個(gè)object。
谷歌官方推薦把view當(dāng)id用,所以常規(guī)的instantiateItem()函數(shù)的返回值是你自己定義的view,而isViewFromObject()的返回值是view == object。
ps:感覺(jué)這個(gè)機(jī)制應(yīng)該是歷史遺留問(wèn)題,屬于改bug改出來(lái)的機(jī)制。否則官方不會(huì)推薦這種把view當(dāng)id的做法

用ViewPager來(lái)實(shí)現(xiàn)應(yīng)用的引導(dǎo)頁(yè)

//初始化引導(dǎo)頁(yè)數(shù)據(jù)
//本例中引導(dǎo)頁(yè)有四張圖片
    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);
    }
//初始化引導(dǎo)頁(yè)布局
//用四個(gè)ImageView來(lái)裝這四張圖片
    private void initGuideView()
    {
        mImageViews=new ArrayList<>();
        for(int i=0;i<mImageIds.size();++i)
        {
            ImageView imageView=new ImageView(this);
            mImageViews.add(imageView);
        }
    }

    //初始化ViewPager
    //并且為其添加監(jiān)聽(tīng)事件實(shí)現(xiàn)滑動(dòng)最后一頁(yè)一定距離時(shí)跳轉(zhuǎn)到登錄頁(yè)
    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();
                        //獲取屏幕長(zhǎng)度
                        WindowManager windowManager=(WindowManager)getApplicationContext().getSystemService(Context.WINDOW_SERVICE);
                        Point size=new Point();
                        windowManager.getDefaultDisplay().getSize(size);
                        int width=size.x;
                        //首先確定是否到了最后一頁(yè),在判斷滑動(dòng)距離是否符合
                        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();
        }

        //判斷當(dāng)前分頁(yè)是不是view,因?yàn)閂iewPager的分頁(yè)可以填入Fragment
        @Override
        public boolean isViewFromObject(View view,Object object)
        {
            return view==object;
        }

        //清理內(nèi)存,釋放滑過(guò)的頁(yè)的內(nèi)存
        @Override
        public void destroyItem(ViewGroup container,int position,Object object)
        {
            container.removeView(mImageViews.get(position));
        }

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


    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容