Llame a actvity después de que el viewpager haya terminado

Estoy desarrollando una aplicación en la que tengo que usar viewpager y después de que todos los elementos en viewpager haya terminado tengo que llamar a una actividad. No puedo escuchar a los eventos para esto. Aquí es lo que he estado haciendo referencia también: https://github.com/chiuki/android-swipe-image-viewer/blob/master/src/com/sqisland/android/swipe_image_viewer/MainActivity.java

Esto es lo que he hecho hasta ahora:

public class MainActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ViewPager viewPager = (ViewPager) findViewById(R.id.view_pager); ImagePagerAdapter adapter = new ImagePagerAdapter(); viewPager.setAdapter(adapter); OnPageChangeListener mListener = new OnPageChangeListener() { @Override public void onPageSelected(int arg0) { // TODO Auto-generated method stub } @Override public void onPageScrolled(int arg0, float arg1, int arg2) { } @Override public void onPageScrollStateChanged(int arg0) { Log.i("Doing something here", "On Scroll state changed"); } }; viewPager.setOnPageChangeListener(mListener); } private class ImagePagerAdapter extends PagerAdapter { private int[] mImages = new int[] { R.drawable.libin1, R.drawable.libin2 }; @Override public int getCount() { return mImages.length; } @Override public boolean isViewFromObject(View view, Object object) { return view == ((ImageView) object); } @Override public Object instantiateItem(ViewGroup container, int position) { Context context = MainActivity.this; ImageView imageView = new ImageView(context); int padding = context.getResources().getDimensionPixelSize( R.dimen.padding_medium); imageView.setPadding(padding, padding, padding, padding); imageView.setScaleType(ImageView.ScaleType.CENTER_INSIDE); imageView.setImageResource(mImages[position]); ((ViewPager) container).addView(imageView, 0); return imageView; } @Override public void destroyItem(ViewGroup container, int position, Object object) { ((ViewPager) container).removeView((ImageView) object); } } } 

Mi pregunta es cómo obtener el receptor de eventos si todos los elementos de viewpager están terminados.

Cualquier tipo de ayuda será apreciada.

 private OnPageChangeListener mListener = new OnPageChangeListener() { @Override public void onPageSelected(int arg0) { // TODO Auto-generated method stub selectedIndex = arg0; } boolean callHappened; @Override public void onPageScrolled(int arg0, float arg1, int arg2) { // TODO Auto-generated method stub if( mPageEnd && arg0 == selectedIndex && !callHappened) { Log.d(getClass().getName(), "Okay"); mPageEnd = false;//To avoid multiple calls. callHappened = true; }else { mPageEnd = false; } } @Override public void onPageScrollStateChanged(int arg0) { // TODO Auto-generated method stub if(selectedIndex == adapter.getCount() - 1) { mPageEnd = true; } } }; ViewPager.setOnPageChangeListener(mListener); 

onPageScrolled o onPageSelected cualquiera de estos que puede utilizar aquí y también comprobar la página seleccionada es igual al número de elementos en el ViewPager .

Estas tres llamadas de retorno funcionan de esta manera:

  • OnPageScrollStateChanged se llama con el estado ViewPager.SCROLL_STATE_DRAGGING
  • OnPageScrolled se llamará muchas veces, su parámetro positionOffset y positionOffsetPixels siguen aumentando
  • OnPageScrolled parámetro positionOffset más de 0,5, onPageScrollStateChanged se llama con el estado SCROLL_STATE_SETTLING
  • OnPageSelected se llama con el índice de la página siguiente como posición
  • OnPageScrolled se llamará muchas veces, su parámetro positionOffset y positionOffsetPixels siguen aumentando
  • El parámetro positionOffset de onPageScrolled es 1, onPageScrollStateChanged se llama con el estado SCROLL_STATE_IDLE

La lógica no debe poner en onPageSelected y onPageScrollStateChanged, porque con ellos sólo sabes estado se cambia. Sólo en onPageScrolled puede obtener la dirección. Así que mi implementación es así:

  private int selectedPageIndex = -1; private boolean exitWhenScrollNextPage = false; @Override public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) { if (exitWhenScrollNextPage && position == PAGE_COUNT - 1) { exitWhenScrollNextPage = false; // avoid call more times AndroidLog.error("-------- YEAH!"); } } @Override public void onPageSelected(int position) { selectedPageIndex = position; } @Override public void onPageScrollStateChanged(int state) { if (state == SCROLL_STATE_IDLE) { exitWhenScrollNextPage = selectedPageIndex == PAGE_COUNT - 1; } } 

Gracias Triode por una gran respuesta.

Utilicé el código que publicaste para mi proyecto. En mi caso, estoy terminando la actividad si un usuario pasa a la derecha en el último fragmento. Funcionó bien, pero todavía estaba terminando la actividad cuando se desliza hacia la izquierda en lugar de deslizarse hacia la derecha.

Hice un cambio en su código y poner adapter.getCount() - 1 en lugar de selectedIndex . En este caso no terminará la actividad si el usuario pasa a la izquierda.

 if( mPageEnd && arg0 == adapter.getCount()-1 && !callHappened){ Log.d(getClass().getName(), "Okay"); mPageEnd = false;//To avoid multiple calls. callHappened = true; }else{ mPageEnd = false; } 
 @Override public void onPageScrolled(int pageScrolledOn, float positionOffset, int positionOffsetPixels) { if(positionOffset == 0F){ // meaning you cannot scroll further in current scroll direction int lastPage = viewPagerAdapter.getCount - 1; if (pageScrolledOn == lastPage){ //scroll on last page has occured scrolledOnLastPage = true; } } } 
  • ¿Qué lenguajes de programación puedo usar en Android Dalvik?
  • Android Project Fragment Transición lanzando Excepción cuando Build target used Nueva API Nivel 21
  • ¿Cuál es el equivalente a un setInterval / setTimeout de JavaScript en Android / Java?
  • Cómo implementar el menú de pestaña de Android sin tabhost obsoleto
  • ¿Puedo hacer una solicitud síncrona con volea?
  • Android Wear detecta "Mute"
  • Android - NullPointerException desde la creación de un adaptador
  • Android / Java: ¿Llamar a un método usando reflexión?
  • Error: no se puede ejecutar mksdcard SDK herramienta
  • ¿Cómo puedo descargar el archivo mediante webview? (Este caso es raro)
  • Android Studio 2.2. Previsualizar un error: "Utilice JDK 8 o más reciente"
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.