Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

onPageSelected isn't triggered when calling setCurrentItem(0)

I have an Activity with a ViewPager which displays a bunch of pictures. When it starts the ViewPager's position is set based on what the user selected in a previous Activity. Similar to a gallery.

I want the onPageSelected to be called every time a new page is selected, i.e. when the Activity is first opened or when the user slides to a new page.

I set the starting point like so:

 mPager.setCurrentItem(index); 

Everything works, except when setCurrentItem called with index set to 0 as this will not trigger onPageSelected.

mPager.setOnPageChangeListener(new OnPageChangeListener() {   @Override   public void onPageSelected(int index) {     Log.d(TAG, "onPageSelected " + index);   }   ... } 

So my question is; is this a bug, and if so what can I do about it?

like image 610
jpihl Avatar asked Aug 03 '12 10:08

jpihl


1 Answers

The cleanest solution I've found to this so far is to take a reference to the onPageChangeListener you set on the ViewPager (since I don't think there's a ViewPager.getOnPageChangeListener() method), then after you've set the ViewPager's adapter, call:

onPageChangeListener.onPageSelected(viewPager.getCurrentItem()); 

However, the fragment for the page at the current index won't have been instantiated yet (at least if you're using FragmentStatePagerAdapter), so you may need to wrap it in a runnable, ala:

viewPager.post(new Runnable(){ @Override     public void run() {         onPageChangeListener.onPageSelected(viewPager.getCurrentItem());     } }); 

Also, if within the onPageSelected handler you need a reference to the fragment, you'll have to do that yourself. I use an abstract base class for my FragmentStatePagerAdapter which overrides the instantiate and destroy methods, and adds/removes the fragments from a SparseArray.

like image 164
technicalflaw Avatar answered Sep 21 '22 13:09

technicalflaw