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
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
You would use:
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.
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 listcurrentInventory.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();
}
}
© 2022 - 2024 — McMap. All rights reserved.