setOnPageChangeListener does not call onPageSelected
Asked Answered
D

5

6

I've setup a simpleonpagechangelistener using the following example:

Android SimpleOnPageChangeListener - Determine swipe direction

However when I execute the code then swipe the viewpager I would expect the following line to be called:

public void onPageSelected(int position) {

However it never seems to do so - which is causing a non-functional viewPager.

Any suggestions?

   public class Home extends YouTubeBaseActivity implements VideoClickListener {
    ...
    private int mCurrentTabPosition = NO_CURRENT_POSITION;
    private static final int NO_CURRENT_POSITION = -1;
    private ViewPager mPager;
    ...
    int imageArray[];
    String[] stringArray;

    private OnPageChangeListener mPageChangeListener;
    ImagePagerAdapter adapter = new ImagePagerAdapter();

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.home);

        final ViewPager viewPager = (ViewPager) findViewById(R.id.view_pager);

        viewPager.setAdapter(adapter);
...

        setOnPageChangeListener(mPageChangeListener);


        mPageChangeListener = new ViewPager.SimpleOnPageChangeListener() {


            @Override
            public void onPageSelected(int position) {
                onTabChanged(mPager.getAdapter(), mCurrentTabPosition, position);
                position = mCurrentTabPosition;
                int oldPos = viewPager.getCurrentItem();
                if (position > oldPos) {

                    System.out.print(position);
                    // Moving to the right
                    String playlist = "TheMozARTGROUP‎";
                    new GetYouTubeUserVideosTask(responseHandler, playlist)
                            .execute();

                    View vg = findViewById(R.layout.home);
                    vg.invalidate();

                } else if (position < oldPos) {
                    // Moving to the Left
                    System.out.print(position);
                    String playlist = "TheMozARTGROUP‎";
                    new GetYouTubeUserVideosTask(responseHandler, playlist)
                            .execute();

                    View vg = findViewById(R.layout.home);
                    vg.invalidate();

                }
                viewPager.setOnPageChangeListener(mPageChangeListener);
            }

            private void onTabChanged(PagerAdapter adapter,
                    int mCurrentTabPosition, int position) {
                // TODO Auto-generated method stub

            }
        };

    }

    private void setOnPageChangeListener(
            OnPageChangeListener mPageChangeListener2) {
        // TODO Auto-generated method stub

    }

    ...



    private class ImagePagerAdapter extends PagerAdapter {
        public ImagePagerAdapter(Activity act, int[] mImages,
                String[] stringArra) {
            imageArray = mImages;
            activity = act;
            stringArray = stringArra;
        }


        public ImagePagerAdapter() {
            super();

        }

        private int[] mImages = new int[] { R.drawable.selstation_up_btn,
                R.drawable.classical_up_btn, R.drawable.country_up_btn,
                R.drawable.dance_up_btn, R.drawable.hiphop_up_btn,
                R.drawable.island_up_btn, R.drawable.latin_up_btn,
                R.drawable.pop_up_btn, R.drawable.samba_up_btn };

        private String[] stringArray = new String[] { "vevo",
                "TheMozARTGROUP‎", "TimMcGrawVEVO‎", "TiestoVEVO‎",
                "EminemVEVO‎" };

        @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 = Home.this;
            ImageView imageView = new ImageView(context);
            imageView.setScaleType(ScaleType.FIT_XY);
            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);
        }

        protected void onTabChanged(final PagerAdapter adapter,
                final int oldPosition, final int newPosition) {
            // Calc if swipe was left to right, or right to left
            if (oldPosition > newPosition) {
                // left to right
            } else {
                // right to left


            }
            final ViewPager viewPager = (ViewPager) findViewById(R.id.view_pager);

        }
    }
}

XML:

 <android.support.v4.view.ViewPager
  android:id="@+id/view_pager"
  android:layout_width="wrap_content"
  android:layout_height="fill_parent" />
Despoil answered 13/12, 2013 at 14:56 Comment(0)
C
1

Use

 viewPager.setOnPageChangeListener(mPageChangeListener);

Remove

 private void setOnPageChangeListener(
        OnPageChangeListener mPageChangeListener2) {
    // TODO Auto-generated method stub

}

and

 setOnPageChangeListener(mPageChangeListener);
Cordi answered 13/12, 2013 at 15:7 Comment(0)
V
29

I was using ViewPagerIndicator and it turns out that when you do that, you should set the OnPageChangeListener on the indicator instead of on the viewpager. (as documented)

So do:

    mIndicator.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
        @Override
        public void onPageSelected(int position) {
            doYourThing();
        }
    });

instead of:

    mPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener() {
        @Override
        public void onPageSelected(int position) {
            doYourThing();
        }
    });

The same thing applies if you're using SlidingTabLayout

Varitype answered 6/5, 2014 at 14:50 Comment(3)
This is also the case with Google's SlidingTabLayout.Sapphera
@CiskeBoeklo What is that mIndication suppose to be?Evelyn
The ViewPagerIndicator object you have created if you're using that library. Or the sliding tab layout object if you're using that.Varitype
C
1

Use

 viewPager.setOnPageChangeListener(mPageChangeListener);

Remove

 private void setOnPageChangeListener(
        OnPageChangeListener mPageChangeListener2) {
    // TODO Auto-generated method stub

}

and

 setOnPageChangeListener(mPageChangeListener);
Cordi answered 13/12, 2013 at 15:7 Comment(0)
H
0

Did you tried to use a ViewPager.setOnPageChangeListener instead your SimpleChangeListener? just try it:

mPager.setOnPageChangeListener(new OnPageChangeListener() {

        @Override
        public void onPageSelected(int pos) {

        }

        @Override
        public void onPageScrolled(int arg0, float arg1, int arg2) {
            // TODO Auto-generated method stub

        }

        @Override
        public void onPageScrollStateChanged(int pos) {

        }
    });
Hemialgia answered 13/12, 2013 at 15:8 Comment(0)
J
0

I had the same problem now - I also set a variable as a equal to:

 mPageChangeListener =  new ViewPager.OnPageChangeListener() {<methods>}

and then assigned it to my viewpager afterwards by:

 mPager.setOnPageChangeListener(mPageChangeListener)

The reason why your code doesn't work is because you are creating your local variable inside your onCreate method. Two ways you can fix this:

  1. You can assign your code for the onPageChangeListener inside your setter so:

mPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {<methods>})

  1. you can create a member variable for your 'mPageChangeListener' so that it will be initialised before onCreate is called. So copy your mPageChangeListener code above your onCreate method and initialise there.
Jemison answered 30/4, 2015 at 20:17 Comment(0)
G
0
        viewPager.setOnPageChangeListener(new OnPageChangeListener() {

            public void onPageSelected(int currentPage) {
                // work here after changing page
            }

        });
Glynn answered 11/10, 2015 at 20:41 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.