我想设置我的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"