android – 如何在ViewPager上进行循环滚动?

前端之家收集整理的这篇文章主要介绍了android – 如何在ViewPager上进行循环滚动?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想设置我的ViewPager做圆形滚动.我希望第一页能够滚动到第2页和最后一页.而且我想我的最后一页滚动到[最后一页-1]和第一页.我已经尝试了,虽然我不知道什么时候调用我创建的方法.在ViewPager中似乎没有处理这种事情的方法,所以我创建了以下.
public ViewPagerAdapter(final ViewPager pager,int... pageIDs) {
        super();
        int actualNoOfIDs = pageIDs.length;
        count = actualNoOfIDs + 2;
        Log.d(TAG,"actualNoOfIDs: " + actualNoOfIDs +
                "count: " + count);

        pageIDsArray = new int[count];
        for (int i = 0; i < actualNoOfIDs; i++) {
            pageIDsArray[ i + 1] = pageIDs[i];
        }
        pageIDsArray[0] = pageIDs[actualNoOfIDs - 1];
        pageIDsArray[count - 1] = pageIDs[0];

        Log.d(TAG,"actualNoOfIDs#2: " + actualNoOfIDs +
                "count#2: " + count);
        pager.setOnPageChangeListener(new OnPageChangeListener() {
            @Override
            public void onPageSelected(int position) {
                int pageCount = getCount();
                if (position == 0) {
                    pager.setCurrentItem(pageCount - 2,false);
                } else if (position == pageCount - 1) {
                    pager.setCurrentItem(1,false);
                }
            }

            @Override
            public void onPageScrollStateChanged(int state) {
                // TODO Auto-generated method stub
                Log.d(TAG,"onPageScrollStateChanged()");
//              if (state == ViewPager.SCROLL_STATE_IDLE) { 
//                  int pageCount = getCount(); 
//                  int currentItem = pager.getCurrentItem(); 
//                  if (currentItem == 0) { 
//                      pager.setCurrentItem(pageCount - 2,false); 
//                  } else if (currentItem == pageCount - 1) { 
//                      pager.setCurrentItem(1,false); 
//                  } 
//              } 

            }

            @Override
            public void onPageScrolled(int position,float positionOffset,int positionOffsetPixels) {
                // TODO Auto-generated method stub
                Log.d(TAG,"onPageScrolled()");

            }
        });
    }

我的整个代码很冗长,但如果它有助于我可以发布.

public class ViewPagerAdapter extends PagerAdapter {
    public static String TAG = ViewPagerAdapter.class.getSimpleName();

    private int count;
    private int[] pageIDsArray;

    private TextToSpeech btnTTS;
    private TtsButton tTSBtn;

    String inputTxt;
    Context context;
    View itemView;

    TextView tvNumber; // container for atomic number
    TextView tvSymbol; // container for symbol
    TextView tvWeight; // container for weight
    TextView tvName; // container for name
    TextView tvGroup; // container for group
    TextView tvPeriod; // container for period
    TextView tvBlock; // container for block
    TextView tvFamily; // container for family
    TextView tvColor; // container for color
    TextView tvPhase; // container for phase
    TextView tvMelt; // container for melting point
    TextView tvBoil; // container for boiling point
    TextView tvNeutrons; // container for neutrons
    TextView tvProtons; // container for protons
    TextView tvElectrons; // container for electrons
    TextView tvUrl; // container for electrons

    public ViewPagerAdapter(Context context,List<Integer> arrayAtomicNum,List<String> arrayName,List<String> arraySymbol,List<String> arrayFamily,List<String> arrayPhase,List<String> arrayColor,List<Integer> arrayGroup,List<Integer> arrayPeriod,List<String> arrayBlock,List<Integer> arrayProtons,List<Integer> arrayNeutrons,List<Integer> arrayElectrons,List<Double> arrayWeight,List<Double> arrayMelt,List<Double> arrayBoil,List<String> arrayUrl) {    
        this.context = context;
        ElementStructure.arrayAtomicNum = arrayAtomicNum;
        ElementStructure.arrayName = arrayName;
        ElementStructure.arraySymbol = arraySymbol;
        ElementStructure.arrayFamily = arrayFamily;
        ElementStructure.arrayPhase = arrayPhase;
        ElementStructure.arrayColor = arrayColor;
        ElementStructure.arrayGroup = arrayGroup;
        ElementStructure.arrayPeriod = arrayPeriod;
        ElementStructure.arrayBlock = arrayBlock;
        ElementStructure.arrayProtons = arrayProtons;
        ElementStructure.arrayNeutrons = arrayNeutrons;
        ElementStructure.arrayElectrons = arrayElectrons;
        ElementStructure.arrayWeight = arrayWeight;
        ElementStructure.arrayMelt = arrayMelt;
        ElementStructure.arrayBoil = arrayBoil;
        ElementStructure.arrayUrl = arrayUrl;
    }


    public ViewPagerAdapter(final ViewPager pager,"onPageScrolled()");

            }
        });
    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return ElementStructure.arrayAtomicNum.size();

    }

    @Override
    public boolean isViewFromObject(View view,Object object) {
        // TODO Auto-generated method stub
        return view == ((RelativeLayout) object);
    }

    @Override
    public Object instantiateItem(ViewGroup container,final int position) {

        LayoutInflater inflater = (LayoutInflater) context
             .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        int layoutColorId = ElementStructure.arrayLayoutColor.get(position);

        if (layoutColorId == 1) {
            itemView = inflater.inflate(R.layout.frame_learn_a,container,false);
        } else if (layoutColorId == 2) {
            itemView = inflater.inflate(R.layout.frame_learn_b,false);
        } else if (layoutColorId == 3) {
            itemView = inflater.inflate(R.layout.frame_learn_c,false);
        } else if (layoutColorId == 4) {
            itemView = inflater.inflate(R.layout.frame_learn_d,false);    
        }

        Button btnSpeak = (Button)itemView.findViewById(R.id.btnaudio);

        btnSpeak.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                // TODO Auto-generated method stub
                inputTxt = ElementStructure.arrayName.get(position);
                tTSBtn = new TtsButton(this,inputTxt); 
            }

        });

        // atomic number textView
        tvNumber = (TextView)itemView.findViewById(R.id.Metanumber);

        // symbol textView
        tvSymbol = (TextView)itemView.findViewById(R.id.Metasymbol);

        // weight textView
        tvWeight = (TextView)itemView.findViewById(R.id.Metaweight);

        // name textView
        tvName = (TextView)itemView.findViewById(R.id.Metaname);

        // group textView
        tvGroup = (TextView)itemView.findViewById(R.id.Metagroup);

        // period textView
        tvPeriod = (TextView)itemView.findViewById(R.id.Metaperiod);

        // block textView
        tvBlock = (TextView)itemView.findViewById(R.id.Metablock);

        // family textView
        tvFamily = (TextView)itemView.findViewById(R.id.Metafamily);

        // color textView
        tvColor = (TextView)itemView.findViewById(R.id.Metacolor);

        // phase textView
        tvPhase = (TextView)itemView.findViewById(R.id.Metaphase);

        // melting point textView
        tvMelt = (TextView)itemView.findViewById(R.id.Metamelt);

        // boiling point textView
        tvBoil = (TextView)itemView.findViewById(R.id.Metaboil);

        // neutrons textView
        tvNeutrons = (TextView)itemView.findViewById(R.id.Metaneutrons);

        // protons textView
        tvProtons = (TextView)itemView.findViewById(R.id.Metaprotons);

        // electrons textView
        tvElectrons = (TextView)itemView.findViewById(R.id.Metaelectrons);

        // url textView
        tvUrl = (TextView)itemView.findViewById(R.id.Metaurl);

        // capture position and set to the TextViews
        tvNumber.setText(String.valueOf(ElementStructure.arrayAtomicNum.get(position)));
        tvSymbol.setText(ElementStructure.arraySymbol.get(position));
        tvWeight.setText(String.valueOf(ElementStructure.arrayWeight.get(position)));
        tvName.setText(ElementStructure.arrayName.get(position));
        tvPeriod.setText(String.valueOf(ElementStructure.arrayPeriod.get(position)));
        tvBlock.setText(String.valueOf(ElementStructure.arrayBlock.get(position)));
        tvFamily.setText(ElementStructure.arrayFamily.get(position));
        tvColor.setText(ElementStructure.arrayColor.get(position));
        tvPhase.setText(ElementStructure.arrayPhase.get(position));
        tvNeutrons.setText(String.valueOf(ElementStructure.arrayNeutrons.get(position)));
        tvProtons.setText(String.valueOf(ElementStructure.arrayProtons.get(position)));
        tvElectrons.setText(String.valueOf(ElementStructure.arrayElectrons.get(position)));
        tvUrl.setText(ElementStructure.arrayUrl.get(position));

        // capture position,adjust for 0 value cases
        if (ElementStructure.arrayGroup.get(position) == 0) {
            tvGroup.setText("n/a");
        } else {
            tvGroup.setText(String.valueOf(ElementStructure.arrayGroup.get(position)));
        }

        if (ElementStructure.arrayMelt.get(position) == 0) {
            tvMelt.setText("n/a");
        } else {
            tvMelt.setText(String.valueOf(ElementStructure.arrayMelt.get(position)));
        }

        if (ElementStructure.arrayBoil.get(position) == 0) {
            tvBoil.setText("n/a");
        } else {
            tvBoil.setText(String.valueOf(ElementStructure.arrayBoil.get(position)));
        }

        // add fragments to container (ViewPager)
        ((ViewPager) container).addView(itemView);
        return itemView;

    }

    @Override
    public void destroyItem(ViewGroup container,int position,Object object) {
        Log.d(TAG,"destroyItem()");
        // remove fragments from container (ViewPager)
        ((ViewPager) container).removeView((RelativeLayout) object);
    }


    @Override
    public void finishUpdate(View container) {
        // TODO Auto-generated method stub
        Log.d(TAG,"finishUpdate()");
    }

    @Override
    public void restoreState(Parcelable state,ClassLoader loader) {
        // TODO Auto-generated method stub
        Log.d(TAG,"restoreState()");
    }

    @Override
    public Parcelable saveState() {
        // TODO Auto-generated method stub
        Log.d(TAG,"saveState()");
        return null;
    }

    @Override
    public void startUpdate(View container) {
        // TODO Auto-generated method stub
        Log.d(TAG,"startUpdate()");
    }




    public class TtsButton extends Activity implements OnInitListener {

        public TtsButton(OnClickListener onClickListener,String inputTxt) {
            super();
            tTSCheck(inputTxt);
        }

        private void tTSCheck (String inputTxt) {

            int resultCodeCheck = TextToSpeech.Engine.CHECK_VOICE_DATA_PASS;
            if (resultCodeCheck == 1) {
                btnTTS = new TextToSpeech(context,this);
            } else {
                Intent installTTSFiles = new Intent(); //missing data,install it
                installTTSFiles.setAction(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA);
                startActivity(installTTSFiles);
            }
        }

        @Override
        public void onInit(int status) {
            // TODO Auto-generated method stub
            if(status == TextToSpeech.SUCCESS)
            {
                Log.i(TAG,"TTS INIT: SUCCESS");
                btnTTS.setLanguage(Locale.US);
                btnTTS.speak(inputTxt,TextToSpeech.QUEUE_FLUSH,null);
            }
            else if(status == TextToSpeech.ERROR)
            {
                Log.e(TAG,"TTS INIT: ERROR");
            }
        }

        @Override
        public void onPause() {
            if (btnTTS != null) {
                btnTTS.stop();
                btnTTS.shutdown();
            }
            super.onPause();
        }

    } //end embedded class

} //end ViewPagerAdapter

提前致谢.我正在考虑尝试使用动作手势,但是,我真的不明白为什么我的方法不会工作很长时间,我可以把它称为正确的位置.我最初的想法是在每次位置发生变化时,在“Object instantiateItem(ViewGroup container,final int position)”中调用它,如果条件是正确的.但我不知道这是否最好.

解决方法

这是一个没有假页面解决方案,它的作用就像一个魅力:
public class CircularViewPagerHandler implements ViewPager.OnPageChangeListener {
    private ViewPager   mViewPager;
    private int         mCurrentPosition;
    private int         mScrollState;

    public CircularViewPagerHandler(final ViewPager viewPager) {
        mViewPager = viewPager;
    }

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

    @Override
    public void onPageScrollStateChanged(final int state) {
        handleScrollState(state);
        mScrollState = state;
    }

    private void handleScrollState(final int state) {
        if (state == ViewPager.SCROLL_STATE_IDLE) {
            setNextItemIfNeeded();
        }
    }

    private void setNextItemIfNeeded() {
        if (!isScrollStateSettling()) {
            handleSetNextItem();
        }
    }

    private boolean isScrollStateSettling() {
        return mScrollState == ViewPager.SCROLL_STATE_SETTLING;
    }

    private void handleSetNextItem() {
        final int lastPosition = mViewPager.getAdapter().getCount() - 1;
        if(mCurrentPosition == 0) {
            mViewPager.setCurrentItem(lastPosition,false);
        } else if(mCurrentPosition == lastPosition) {
            mViewPager.setCurrentItem(0,false);
        }
    }

    @Override
    public void onPageScrolled(final int position,final float positionOffset,final int positionOffsetPixels) {
    }
}

您只需将其设置为您的ViewPager作为onPageChangeListener就可以了:

viewPager.setOnPageChangeListener(new CircularViewPagerHandler(viewPager));

为了避免在您的ViewPager的“结束”上发出蓝色的光芒,您应该将此行应用于您放置ViewPager的xml:

android:overScrollMode="never"

猜你在找的Android相关文章