android scroll android-viewpager

android - ¿Cómo hacer desplazamiento circular en ViewPager?



scroll android-viewpager (9)

Esta es mi solución:

myViewPager.java

public class myViewPager extends PagerAdapter { public myViewPager (Context context) { this.context = context; } @Override public int getCount() { return rank.length+2; } @Override public boolean isViewFromObject(View view, Object object) { return view == object; } @Override public Object instantiateItem(ViewGroup container, int position) { // Declare Variables TextView textViewRank; //Log.i(TAG, "get position = "+position); inflater = (LayoutInflater) context .getSystemService(Context.LAYOUT_INFLATER_SERVICE); View itemView = inflater.inflate(R.layout.viewpager_item, container, false); textViewRank= (TextView) itemView.findViewById(R.id.textView1); if (position == getCount() - 1) { textViewRank.setText(rank[0]); } else if (position == 0) { textViewRank.setText(rank[rank.length-1]); } else { textViewRank.setText(rank[position-1]); } ((ViewPager) container).addView(itemView); return itemView; } @Override public void destroyItem(ViewGroup container, int position, Object object) { container.removeView((View) object); } }

viewpager_item.xml

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:orientation="horizontal" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1" android:id="@+id/textView1"/> </LinearLayout>

MainActivity.java

public class MainActivity extends AppCompatActivity { private static final String TAG = MainActivity.class.getName(); public static String[] rank; myViewPager adapter; private ViewPager viewPager; private static int currentPage; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); rank = new String[] { "1", "2", "3", "4", "5", "6", "7", "8", "9", "10" }; viewPager = (ViewPager) findViewById(R.id.view_pager); adapter = new myViewPager(this); viewPager.setAdapter(adapter); viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageSelected(int position) { Log.i(TAG, "onPageSelected = "+position); currentPage = position; } @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { // not needed } @Override public void onPageScrollStateChanged(int state) { if (state == ViewPager.SCROLL_STATE_IDLE) { int pageCount = rank.length+2; if (currentPage == pageCount-1){ viewPager.setCurrentItem(1,false); } else if (currentPage == 0){ viewPager.setCurrentItem(pageCount-2,false); } } } }); } }

activity_main.xml

<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.v4.view.ViewPager android:id="@+id/view_pager" android:layout_width="match_parent" android:layout_height="match_parent" android:layout_weight="1" /> </LinearLayout>

Se supone que la matriz tiene 10 elementos. Luego "agregue" 2 elementos ficticios, pero no agregue realmente. Cuando se llama a la función "get_count", simplemente devuelve size = 10 + 2 elementos.

dummy e [0] e [1] e [2] e [3] e [4] e [5] e [6] e [7] e [8] e [9] dummy

En viewPager.addOnPageChangeListener:

cuando se desliza al último elemento, viewPager debe establecer el primer elemento como siguiente.

if (currentPage == pageCount-1){ viewPager.setCurrentItem(1,false); }

cuando se desliza al primer elemento, viewPager debe establecer el último elemento como siguiente.

else if (currentPage == 0){ viewPager.setCurrentItem(pageCount-2,false); }

En instanciar

if (position == getCount() - 1) { textViewRank.setText(rank[0]); } else if (position == 0) { textViewRank.setText(rank[rank.length-1]); } else { textViewRank.setText(rank[position-1]); }

Me gustaría configurar mi ViewPager para hacer desplazamiento circular. Quiero que la primera página pueda desplazarse a la página 2 Y a la última página. Y me gustaría que mi última página se desplace a [última página -1] Y a la primera página. Hice un intento, aunque no estoy seguro de cuándo llamar al método que he creado. No parece haber un método en ViewPager que maneje este tipo de cosas, así que creé el siguiente

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()"); } }); }

Mi código completo es un poco largo, pero si me ayuda puedo publicarlo.

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, 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()"); } }); } @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, container, false); } else if (layoutColorId == 3) { itemView = inflater.inflate(R.layout.frame_learn_c, container, false); } else if (layoutColorId == 4) { itemView = inflater.inflate(R.layout.frame_learn_d, container, 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

Gracias por adelantado. Estaba pensando en intentar usar el gesto de movimiento, sin embargo, realmente no entiendo por qué mi método no funcionará por tanto tiempo como para poder llamarlo en el lugar correcto. Mi idea inicial fue llamarlo en "Object instantiateItem (ViewGroup container, final int position)" cada vez que la posición cambia, y si las condiciones son correctas. Pero no estoy seguro de si eso es lo mejor.


Esta es una solución sin páginas falsas y funciona a la perfección:

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) { } }

Solo debes configurarlo en tu ViewPager como onPageChangeListener y eso es todo:

viewPager.setOnPageChangeListener(new CircularViewPagerHandler(viewPager));

Para evitar que este brillo azul aparezca al "final" de su ViewPager, debe aplicar esta línea a su xml donde se encuentra el ViewPager:

android:overScrollMode="never"


He intentado la solución de @ portfoliobuilder, es genial. Pero hay un pequeño problema: cuando el elemento actual es la cabeza o la cola, si simplemente hago clic en ViewPager, no arrastra, el elemento cambiará a la cola o la cabeza. Y agregué una escucha táctil al ViewPager para resolver el problema.

skinPager.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { //Record the x when press down and touch up, //to judge whether to scroll between head and tail int x = (int) event.getX(); int y = (int) event.getY(); if(event.getAction() == MotionEvent.ACTION_DOWN) skinPagerPressX = x; else if(event.getAction() == MotionEvent.ACTION_UP) skinPagerUpX = x; return false; } });

La siguiente es la función modificada de portfoliobuilder:

private void handleSetNextItem() { final int lastPosition = skinPager.getAdapter().getCount() - 1; //Only scroll when dragged if(mCurrentPosition == 0 && skinPagerUpX > skinPagerPressX) { skinPager.setCurrentItem(lastPosition, false); } else if(mCurrentPosition == lastPosition && skinPagerUpX < skinPagerPressX) { skinPager.setCurrentItem(0, false); } }


La respuesta de @tobi_b no es totalmente exitosa, ya que no se desliza suavemente de la última a la primera (al menos en mi prueba). Pero estaba realmente inspirado por su respuesta. Mi solución es cuando es el momento de saltar del último falso al verdadero primero, esperar hasta que finalice el último desplazamiento. Aquí está mi código, es muy simple,

private final class MyPageChangeListener implements OnPageChangeListener { private int currentPosition; @Override public void onPageScrollStateChanged(int state) { if (state == ViewPager.SCROLL_STATE_IDLE) { if (currentPosition == viewPager.getAdapter().getCount() - 1) { viewPager.setCurrentItem(1, false); } else if (currentPosition == 0) { viewPager.setCurrentItem(viewPager.getAdapter().getCount() - 2, false); } } } @Override public void onPageScrolled(int scrolledPosition, float percent, int pixels) { //empty } @Override public void onPageSelected(int position) { currentPosition = position; } }

Sin embargo, esta solución no es perfecta. Tiene un pequeño defecto cuando se desliza rápido de la última a la primera. Si nos deslizamos dos veces en muy poco tiempo, la segunda diapositiva se invalidará. Este problema necesita ser resuelto.


Modifiqué ligeramente la respuesta de @portfoliobuilder. Es muy sencillo. Configurar el elemento actual sin desplazamiento suave hasta que PageChangeState sea ​​"0", por lo que sería muy suave.

((ViewPager)container).setOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { } @Override public void onPageSelected(int position) { currentPage = position; } @Override public void onPageScrollStateChanged(int state) { // state equals to 0 means the scroll action is stop if(state == 0) { if(currentPage == 0) ((ViewPager)container).setCurrentItem(imageResourceList.size()-2,false); if(currentPage == imageResourceList.size()-1) ((ViewPager)container).setCurrentItem(1,false); } } });


Ok, tengo una respuesta. En realidad fue más fácil de lo que esperaba, pero requiere algunos trucos. En primer lugar, permítanme comenzar con la configuración. Digamos, por ejemplo, que tiene tres páginas (ABC) por las que se está desplazando en su ViewPager. Y desea configurarlo para que, si continúa desplazándose en C (pág. 3), vaya a A (pág. 1) y si retroceda en A (pág. 1) vaya a C (pág. 3 ).

No estoy diciendo que mi solución sea la mejor, pero funciona y no veo ningún problema. Primero, tienes que crear dos páginas "falsas". Las páginas falsas representan la primera y la última página de su ViewPager. Lo siguiente que necesitará es configurar un onPageChangeListener () y usar el método onPageSelected (). La razón por la que necesita las páginas falsas es porque onPageSelected () solo se registra después de que se haya movido (deslizado). En otras palabras, sin este método, el usuario final tendría que desplazarse a la página 2 y volver a la página 1 para recibir un resultado en la página 1, lo que también significa que la página 1 se omitirá según la lógica de su código.

La configuración es realmente la respuesta completa. Una vez que tenga sus páginas falsas, es solo cuestión de usar setCurrentItem () dentro del método necesario.

Así es como se ve mi código. Asegúrese de colocar esto dentro de su método público de instancia de objeto (grupo final de ViewGroup, posición int final), justo antes de regresar su vista dentro de su contenedor.

((ViewPager) container).setOnPageChangeListener(new OnPageChangeListener() { @Override public void onPageSelected(int position) { Log.d(TAG, "onPageSelected() :: " + "position: " + position); // skip fake page (first), go to last page if (position == 0) { ((ViewPager) container).setCurrentItem(118, false); } // skip fake page (last), go to first page if (position == 119) { ((ViewPager) container).setCurrentItem(1, false); //notice how this jumps to position 1, and not position 0. Position 0 is the fake page! } }

Eso es todo, hace el truco! Lo único que hay que hacer es iniciar su ViewPager en la posición 1 (que es la segunda página: página falsa = pág. 1, mi página de inicio real = pág. 2). Ahora, cada vez que me desplazo a la página falsa, la redirigí hacia atrás a la última página real. Y cada vez que me desplazo hacia la última página falsa, la reenvío a la página de inicio real (pág. 2).

Además, no intentes poner ningún código en onPageScrollStateChanged. Ese método es extraño, parece que el valor del estado es incontrolable. Salta constantemente de un estado a otro. Incluso sin desplazamiento. Eso es sólo un consejo que recogí.


Prueba esto

((ViewPager) container) .setOnPageChangeListener(new OnPageChangeListener() { @Override public void onPageSelected(int position) { Log.i("TAG", "pos::" + position); } @Override public void onPageScrollStateChanged(int state) { // TODO Auto-generated method stub int currentPage = pager.getCurrentItem(); Log.i("TAG", "currentPage::" + currentPage); Log.i("TAG", "currentState::" + currentState); Log.i("TAG", "previousState::" + previousState); if (currentPage == 4 || currentPage == 0) { previousState = currentState; currentState = state; if (previousState == 1 && currentState == 0) { pager.setCurrentItem(currentPage == 0 ? 4 : 0); } } } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { // TODO Auto-generated method stub } }); return

Esto debe ser colocado dentro

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


He creado el viewpager circular con desplazamiento suave desde el último al primero en deslizar hacia la izquierda y el primero en durar durante el deslizamiento a la derecha.

para esto, agregue la última página en la página inicial y la primera en la última: dentro de addOnPageChangeListener: tenemos que hacer un cálculo, cuando estamos en la posición 0, en onPageScrollStateChanged, establezca el elemento actual como el último elemento y vise-versa.

Echa un vistazo al código.

public class ViewPagerCircular_new extends AppCompatActivity { ViewPager viewPager; ArrayList<String> str = new ArrayList<String>(); boolean chageImage = false; int setPos; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.view_pager_normal); viewPager = (ViewPager) findViewById(R.id.vf_home_top_pager); str.add("6"); // added the last page to the frist str.add("1"); // First item to display in view pager str.add("2"); str.add("3"); str.add("4"); str.add("5"); str.add("6"); // last item to display in view pager str.add("1"); // added the first page to the last ViewPagerAdapter adapter = new ViewPagerAdapter(getSupportFragmentManager()); viewPager.setAdapter(adapter); viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() { @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { if (position == str.size() - 1) { chageImage = true; setPos = 1; } else if (position == 0) { chageImage = true; setPos = str.size() - 2; } else { chageImage = false; } } @Override public void onPageSelected(int position) { } @Override public void onPageScrollStateChanged(int state) { if (state == ViewPager.SCROLL_STATE_IDLE && chageImage) { viewPager.setCurrentItem(setPos, false); } } }); // display the 1st item as current item viewPager.setCurrentItem(1); }

// adaptador de buscapersonas

public class ViewPagerAdapter extends FragmentStatePagerAdapter { public ViewPagerAdapter(FragmentManager fm) { super(fm); } @Override public Fragment getItem(int position) { PagerFragment fragment = new PagerFragment(); Bundle bundle = new Bundle(); bundle.putString("pos", str.get(position)); fragment.setArguments(bundle); return fragment; } @Override public int getCount() { return str.size(); } }

// fragmento para mostrar en el adaptador

public class PagerFragment extends Fragment { Bundle bundle; String pos; public PagerFragment() { } @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); bundle = getArguments(); pos = bundle.getString("pos"); } @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { TextView textView = new TextView(ViewPagerCircular_new.this); textView.setGravity(Gravity.CENTER); textView.setTextSize(25); textView.setText(pos); return textView; } }

}


Resolvió la falta de animación mientras iba de derecha a izquierda al pasar la primera página al último y viceversa

Una ligera modificación en la respuesta de @tobi_b, solucionó mi problema. para esta copia agregada de la última página en la página inicial y de la primera a la última. Luego simplemente elimine el operador NOT del método a continuación en PagerAdapter. setCurrentItem (0, false) para setCurrentItem (1, false).

private void setNextItemIfNeeded() { if (isScrollStateSettling()) { handleSetNextItem(); } } private boolean isScrollStateSettling() { return mScrollState == ViewPager.SCROLL_STATE_SETTLING; } private void handleSetNextItem() { final int lastPosition = pager.getAdapter().getCount() - 1; if(mCurrentPosition == 0) { pager.setCurrentItem(lastPosition-1, false); } else if(mCurrentPosition == lastPosition) { pager.setCurrentItem(1, false); } }

Y en su MainActivity.java no olvide configurar el elemento actual como 1. Esperando que esto ayude a algunos.