4

I use ViewPager loaded with fragments in it and I want to know which fragment is currently shown or selected in the viewpager.

The onResume() method of each fragments does some logic and so i get problems when the adjacent fragments(left and right) to the currently selected page are also instantiated.

Updated:

Does the fragment get any callbacks when it get actually selected?

ViewPager Adapter code:

public class LeftPanelPagerAdapter extends FragmentStatePagerAdapter
 {
private List<Fragment> fragments;

public LeftPanelPagerAdapter(FragmentManager fm,List<Fragment> fragments) 
{
    super(fm);
    this.fragments = fragments;

}

@Override
public Fragment getItem(int position) 
{
    return this.fragments.get(position);
}

@Override
public int getCount() 
{

    return this.fragments.size();
}

@Override
public int getItemPosition(Object object) 
{
    return POSITION_NONE;
}
@Override
  • You can set a `OnPageChangeListener` on your `ViewPager` to get notified when the selection changes. – user Sep 29 '12 at 07:40
  • @Luksprog i have implemented onPageChangeListener, but the problem is when adjacent pages get loaded and the onResume() is called before they are actually shown. –  Sep 29 '12 at 08:18
  • @Nammari updated with the code. –  Sep 29 '12 at 08:18

6 Answers6

4

Since the code posted by confucius, did not work for me. I modified it a little.

The problem is that not your FragmentStatePagerAdapter should implement the OnPageChangeListener, but the Activity itself. And you should set a listener for the mPager which contains your LeftPanelPagerAdapter.

public class ImageDetailActivity extends Activity implements OnPageChangeListener

@Override
public void onCreate(Bundle savedInstanceState)
{
    mPager = (ViewPager) findViewById(R.id.pager);
    mPager.setAdapter(mAdapter);
    mPager.setOnPageChangeListener(this);
....
}

br MikeT

Mike T
  • 1,194
  • 14
  • 25
3

just use ViewPager.getCurrentItem() and it will return it's position to you.

Muhammed Refaat
  • 8,914
  • 14
  • 83
  • 118
2
FragmentPagerAdapter adapter = (FragmentPagerAdapter) mViewPager.getAdapter();
((IFieldServiceFragment) adapter.getItem(mViewPager.getCurrentItem()))
                .updateFragment();

You can get the index of the current item from the ViewPager and then get that item (Fragment) from the Adapter.

Mac
  • 432
  • 3
  • 9
1

with ViewPager.getCurrentItem()
you can get current position of fragment in adapter https://developer.android.com/reference/android/support/v4/view/ViewPager.html#getCurrentItem(

To get event when viewpager change fragment you can use ViewPager.OnPageChangeListener

viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

        }

        @Override
        public void onPageSelected(int position) {

        }

        @Override
        public void onPageScrollStateChanged(int state) {

        }
    });
Tung Duong
  • 1,156
  • 7
  • 19
0
public class LeftPanelPagerAdapter extends FragmentStatePagerAdapter implements OnPageChangeListener{
        .....
        .....
        ....

private int currentSelectedFragmentPosition = 0; 
    public void onPageScrollStateChanged(int arg0) {
        // TODO Auto-generated method stub

    }

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

    }

    public void onPageSelected(int arg0) {
        currentSelectedFragmentPosition = arg0;

    }

    public int getCurrentSelectedFragmentPosition() {
        return currentSelectedFragmentPosition;
    }



}

you can implements OnPageChangeListener and add a member variable which can be used to keep tracking the current selected fragment position .

any time you wish to know what is the current selected fragment do this

myAdapter.getCurrentSelectedFragmentPosition();
confucius
  • 13,127
  • 10
  • 47
  • 66
  • 1
    does any methods of the fragment get called when it is selected or shown? –  Sep 29 '12 at 08:21
  • the above code should give you the right way to know which fragment is shown direct to the user – confucius Sep 29 '12 at 08:24
  • @confucius I don't get any feedback in onPageSelected. – Warpzit Jan 28 '13 at 13:26
  • @Warpzit can you post your code ?? did you set the on page selected listener to your pager ?? – confucius Jan 28 '13 at 13:29
  • Pretty much like you. A FragmentStatePagerAdapter which implements OnPageChangeListener. Then I have a breakpoint and a log in the OnPageChangeListener. The problem is all fragments is created right at start and then nothing is called after that. I can swype etc. without any problems. – Warpzit Jan 28 '13 at 13:44
  • But I do use the circlepageindicator which works. Maybe it just takes the event... hmm – Warpzit Jan 28 '13 at 13:46
  • Yes above works, my fault. The circlepageindicator (library) eats the event so I had to implement in from there instead of from the viewpager. – Warpzit Jan 28 '13 at 13:52
  • if you are using the circlePageIndicator you can still do that use the setOnPageChangeListener(this) on the circlePagerIdicator object and every thing will work – confucius Jan 28 '13 at 14:10
0

Here's how i'm get callbacks when my fragments selected

override FragmentStatePagerAdapter's method setPrimaryItem, which is invoked every time new fragment is selected. The Object argument is your Fragment, so the rest is pretty easy.

mViewPager = (ViewPager) findViewById( R.id.view_pager );
mViewPager.setAdapter( new FragmentStatePagerAdapter(manager) {
            @Override
            public void setPrimaryItem(ViewGroup container, int position, Object object) {
                if (object instanceof UpdateWhenSelected) {
                    ((UpdateWhenSelected) object).update();
                }
                super.setPrimaryItem(container, position, object);
            }
            @Override
            public Fragment getItem(int position) {
                        //your code here
                        return ***;
                    }
                } return getItem( position );
            }
            @Override
            public int getCount() { return ***; }
        });

and, of course, implement custon interface to your fragment

public class YourFragment extends Fragment implements UpdateWhenSelected  {

    ...
    public void update() {
        //code
    }
}
AArkh
  • 1