L. Swifter
L. Swifter

Reputation: 3237

How to get ViewPager's current View which is the one show to user in onPageSelected

I use this way to get ViewPager's current View :

private class OuterAdapter extends PagerAdapter{

    private SwipingVideoPage currentPage;

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        SwipingVideoPage page = new SwipingVideoPage();
        container.addView(page);
        return page;
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        container.removeView((View)object);
    }

    @Override
    public void setPrimaryItem(ViewGroup container, int position, Object object) {
        currentPage = (SwipingVideoPage)object;
        super.setPrimaryItem(container, position, object);
    }

    public SwipingVideoPage getCurrenPage() {
        return currentPage;
    }
}

I think I can call ViewPager.getAdapter.getCurrentPage() to get current view. But I found it's not work in ViewPager.OnPageChangeListener.onPageSelected():

private class OuterChangeListener implements ViewPager.OnPageChangeListener {

    @Override
    public void onPageSelected(int position) {
        ((OuterAdapter)outerViewPager.getAdapter()).getCurrenPage()  //this returns the previous shown view, not the right one
    }
}

Maybe the onPageSelected() is called before setPrimaryItem(), is this correct ?

And how to get ViewPage's primary view in onPageSelected() ?

Upvotes: 1

Views: 4588

Answers (2)

L. Swifter
L. Swifter

Reputation: 3237

Just as @Mohammad Fareed said, I didn't find a method to get the current page directly in ViewPager.

So I use this way to solve the problem:

private Map<Integer, View> pageMap;     //records all the pages in the ViewPager
private SwipingVideoPage currentPage;

private class OuterAdapter extends PagerAdapter{

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        SwipingVideoPage page = new SwipingVideoPage();
        container.addView(page);
        pageMap.put(position, page);    //add page
        return page;
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        container.removeView((View)object);
        pageMap.remove(position);      //remove page which is removed from ViewPager
    }
}

private class OuterChangeListener extends ViewPager.SimpleOnPageChangeListener {

    @Override
    public void onPageSelected(int position) {
        currentPage = pageMap.get(position);    //get current page
    }
}

I use these code in my project, and it works great until now.

Upvotes: 5

Snopzer
Snopzer

Reputation: 1692

in the latest packages you can also use

vp.getCurrentItem()

or

vp is the viewPager ,

pageListener = new PageListener();
vp.setOnPageChangeListener(pageListener);

you have to put a page change listener for your viewPager. There is no method on viewPager to get the current page.

private int currentPage;

private static class PageListener extends SimpleOnPageChangeListener{
        public void onPageSelected(int position) {
            Log.i(TAG, "page selected " + position);
               currentPage = position;
    }
}

Upvotes: -2

Related Questions