简体   繁体   中英

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

你会使用:

int position = mViewPager.getCurrentItem()

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.

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.

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 list currentInventory.size() display correctly. Hope this helps someone looking for an updated solution.

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

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM