CQM
CQM

Reputation: 44228

Android PagerAdapter, get current position

I want to get the current position of the visible view of my PagerAdapter

I didn't see an obvious function like getPosition() and I want one.

I want to add an object into its arraylist at that position, but I need to know it first

Upvotes: 32

Views: 42920

Answers (6)

Erik Medina
Erik Medina

Reputation: 335

I just faced this problem yesterday. I needed to start playing an animation in each page when the page is visible to the user and not before.

My adapter inherits from PagerAdapter and I found out that there is a function setPrimaryItem() which is triggered every time a page is shown to the user as the current page.

Called to inform the adapter of which item is currently considered to be the "primary", that is the one show to the user as the current page. This method will not be invoked when the adapter contains no items.

Not only you have a callback for when the page is visible but this callback also provides the position of the current page.

class MyAdapter extends PagerAdapter {

    @Override
    public int getCount() {
        ...
    }

    @Override
    public boolean isViewFromObject(@NonNull @NotNull View view, @NonNull @NotNull Object object) {
        ...
    }

    @Override
    public void setPrimaryItem(@NonNull @NotNull ViewGroup container, int position, @NonNull @NotNull Object object) {
        super.setPrimaryItem(container, position, object);

        // `position` gives you the position of the current page

        // And this is how I managed to play the animation (Lottie library) when the page is visible to the user
        LottieAnimationView animation = ((ViewGroup) object).findViewById(R.id.my_animation_view);
        animation.playAnimation();
    }
}

Upvotes: 0

Biplob Das
Biplob Das

Reputation: 3104

Try this:

  imageSlider.addOnPageChangeListener(object: ViewPager.OnPageChangeListener{
                        override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {}
                        override fun onPageSelected(position: Int) {Log.d(TAG, "Page No.: $position")}
                        override fun onPageScrollStateChanged(state: Int) {}
                    })

Upvotes: 0

Phil Culver
Phil Culver

Reputation: 95

Here's an updated solution that I used myself. Since setOnPageChangeListener is now deprecated you must use addOnPageChangeListener.

viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
            int counterPosition;
            if (position == 0 || position <= currentInventory.size()){
                counterPosition = position + 1;
            } else {
                counterPosition = position;
            }

            viewPagerHeader.setText("Prize " + counterPosition + " of " + currentInventory.size());

        }

        @Override
        public void onPageSelected(int position) {

        }

        @Override
        public void onPageScrollStateChanged(int state) {

        }
    });

The implementation above displays the correct index in my TextView so that positions 0 and the last item in the listcurrentInventory.size() display correctly. Hope this helps someone looking for an updated solution.

Upvotes: 2

Jona
Jona

Reputation: 13555

You would use:

int position = mViewPager.getCurrentItem()

Upvotes: 57

philipp
philipp

Reputation: 4183

I had this problem and could not get the getCurrentItem() methode.

I ended up getting the position from the ViewPager and not from the PageAdapter. The onPageSelected(int currentPage) methode is getting the currently displayed page.

//custom PageAdapter implementation
mAdapter = new AwesomePagerAdapter();

//Our custom view pager that extends from ViewPager
mPager = (CustomViewPager) findViewById(R.id.preview_gallery);

mPager.setAdapter(mAdapter);

// get the item that we should be showing from the intent
mCurrentPage = extra.getInt("currentIndex");

// show the item the user picked
mPager.setCurrentItem(mCurrentPage);

// listen for page changes so we can track the current index
mPager.setOnPageChangeListener(new OnPageChangeListener() {

    public void onPageScrollStateChanged(int arg0) {
    }

    public void onPageScrolled(int arg0, float arg1, int arg2) {
    }

    public void onPageSelected(int currentPage) {
        //currentPage is the position that is currently displayed. 
    }

});

Doing it in the PageAdaper didn't work for me as I want to preload images that are not visible. The position that is passed instantiateItem(View collection, int position) of the PageAdapter` is the position of the next item initialized. This has nothing to do with the item that is displayed.

Upvotes: 25

Shereef Marzouk
Shereef Marzouk

Reputation: 3392

https://github.com/Shereef/ViewPagerPlusExpandableList/blob/master/src/net/shereef/vewpagerplusexpandablelistexample/ViewPagerPlusExpandableListActivity.java#L204

if i write after that line

    Log.i("pager",myPager.getCurrentItem()+"");

it will show in the logcat the current item page while the oncreate is being run which is always 0

noteice i have used the object for the viewpager it self not the adapter.

Upvotes: 3

Related Questions