Call activity after completion of viewing

I am developing an application in which I have to use the viewpager, and after all the elements in the viewpager are finished, I need to call the action. I cannot get an event listener for this. Here is what I already mentioned: https://github.com/chiuki/android-swipe-image-viewer/blob/master/src/com/sqisland/android/swipe_image_viewer/MainActivity.java

Here is what I have done so far:

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

My question is: how to get an event listener if all the elements in the viewpager are finished.

+6
source share
6 answers
 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 or onPageSelected any of them that you can use here, as well as check the selected page, is equal to the number of elements in the ViewPager .

+17
source

these three callbacks work as follows:

  • onPageScrollStateChanged is called with the ViewPager.SCROLL_STATE_DRAGGING state
  • onPageScrolled will be called many times, its positionOffset and positionOffsetPixels parameters continue to increase.
  • onPageScrolled position positionOffset greater than 0.5, onPageScrollStateChanged called with state SCROLL_STATE_SETTLING
  • onPageSelected is called with the index of the next page as a position
  • onPageScrolled will be called many times, its positionOffset and positionOffsetPixels parameters continue to increase.
  • onPageScrolled positionOffset - 1, onPageScrollStateChanged called with state SCROLL_STATE_IDLE

Logic should not include onPageSelected and onPageScrollStateChanged, because with them you only know the state. only onPageScrolled can you get directions. So my implementation is this:

  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; } } 
+3
source

Thanks Troed for the excellent answer.

I used the code that you posted for my project. In my case, I complete the action if the user moves right on the last fragment. It worked fine, but it still ended up when you sat down to the left rather than sneaking to the right.

I made changes to my code and put adapter.getCount() - 1 instead of selectedIndex . In this case, it will not complete the action if the user swipes to the left.

 if( mPageEnd && arg0 == adapter.getCount()-1 && !callHappened){ Log.d(getClass().getName(), "Okay"); mPageEnd = false;//To avoid multiple calls. callHappened = true; }else{ mPageEnd = false; } 
+1
source
 @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; } } } 
0
source

The suggested answers are more complicated than I thought. So I created a simple one.

I used OnPageChangeListener in the ViewPager class. Here we have 3 methods. void onPageScrolled (int position, float positionOffset, int positionOffsetPixels) void onPageSelected (int position); void onPageScrollStateChanged (int state);

It is important to know what are the states in onPageScrollStateChanged () and their sequence of execution. There are 3 states like SCROLL_STATE_IDLE, SCROLL_STATE_DRAGGING and SCROLL_STATE_SETTLING.

Here is the execution order. Scroll_state_dragging → Scroll_state_settling → onPageSelected () → Scroll_state_idle

The idea is for the flag inside onPageSelected () to write the current page number. Then, if the user is on the last page and left-click scroll_state_dragging and run the following view.

 private int pagePosition; // keep a class variable private int[] layouts= new int[]{ R.layout.welcome_slide1, R.layout.welcome_slide2, R.layout.welcome_slide3}; ViewPager.OnPageChangeListener viewPagerPageChangeListener = new ViewPager.OnPageChangeListener() { @Override public void onPageSelected(int position) { addBottomDots(position); pagePosition = position; } @Override public void onPageScrolled(int position, float positionOffset, int arg2) { } @Override public void onPageScrollStateChanged(int state) { if (state == ViewPager.SCROLL_STATE_DRAGGING) { if (pagePosition == layouts.length - 1) { launchHomeScreen(); } } } }; private void launchHomeScreen() { startActivity(new Intent(IntroductionActivity.this, MainDockerActivity.class)); finish(); } 

I created a complete example here.

0
source

When you are on the last page and you complete the operation, the SCROLL_STATE_SETTLING state is skipped and the pager goes directly to SCROLL_STATE_IDLE

 private val viewPagerPageChangeListener = object : ViewPager.OnPageChangeListener{ var blnPageTriesToSettle = false override fun onPageScrollStateChanged(state: Int) { when(state){ SCROLL_STATE_IDLE ->{ if (!blnPageTriesToSettle){ println("You are at the last page and you slide to finish") finish() } } SCROLL_STATE_DRAGGING ->{ blnPageTriesToSettle = false } SCROLL_STATE_SETTLING ->{ blnPageTriesToSettle = true } } } override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) { } override fun onPageSelected(position: Int) { } } 
0
source

All Articles