获取ViewPager的当前位置

时间:2011-11-24 14:38:34

标签: android android-viewpager

我知道使用Gallery小部件,我可以使用getSelectedItemPosition();检索当前位置,但看起来ViewPager似乎没有。

我知道我可以设置一个监听器并在切换页面时检索位置。但我想要当前的观点位置。

5 个答案:

答案 0 :(得分:180)

您可以使用:

mViewPager.getCurrentItem()

答案 1 :(得分:89)

创建一个监听器并在viewpager上设置它:

/**
 * Get the current view position from the ViewPager by
 * extending SimpleOnPageChangeListener class and adding your method
 */
public class DetailOnPageChangeListener extends ViewPager.SimpleOnPageChangeListener {

    private int currentPage;

    @Override
    public void onPageSelected(int position) {
        currentPage = position;
    }

    public final int getCurrentPage() {
        return currentPage;
    }
}

答案 2 :(得分:0)

更新2019

现在,您可以在View Pager上设置addOnPageChangeListener来观察页面位置的变化。

由于您要设置侦听器并在切换页面时检索位置

mViewPager.addOnPageChangeListener(object : OnPageChangeListener {
            override fun onPageScrollStateChanged(state: Int) {}
            override fun onPageScrolled(position: Int, positionOffset: Float, positionOffsetPixels: Int) {}

            override fun onPageSelected(position: Int) {
                pagePosition.setText("" + position + "/" + galleryAdapter!!.count)
            }
        })

答案 3 :(得分:0)

我的解决方案只有在您将 TabLayout 链接到 ViewPager 时才有效。

这是它们的链接方式:

tabLayout.setupWithViewPager(viewPager);

然后获取当前位置,您可以使用:

tabLayout.getSelectedTabPosition()

答案 4 :(得分:-1)

我现在告诉你它是一个黑客攻击,因此没有理由为此推倒。意思是,它或者对你有所帮助。无论哪种方式,下面的描述都将提供一些见解并对社区有所帮助。此外,此解决方案适用于没有ViewPager.getCurrentItem()

的旧API

首先,一点信息。如果您使用ViewPager.getChildAt(x);对ViewPager的所有子项进行迭代,并使用toString()(或getLeft())打印出每个子视图(一个页面),然后每次更改页面时执行此操作,您将请注意,当您开始返回页面时(分页回到开头),子项将不会按照逻辑顺序显示。显然,它会从数组中删除不需要的子项,然后将最新的子项附加到数组中。因此,例如,假设您正在查看第2页,然后更改为第3页,您的子项列表将按此顺序page 2, page 3, page 4表示ViewPager.getChildAt(1);将返回当前页面。但是,如果您再更改回第2页(从第3页开始),您的孩子列表将按此顺序page 2, page 3, page 1,这意味着ViewPager.getChildAt(1);不会返回当前页面。我还没有找到简单的逻辑来使用这些信息来清除当前页面。因为getChildAt后面的数组中页面的顺序是基于用户如何分页的任意顺序。

话虽这么说,我开发了一个hack work-around。我不知道这个函数是否适用于所有环境,但它适用于我当前的项目。我怀疑如果不适合你,那么它是一个不同API级别的问题。但我实际上并不怀疑其他环境有任何问题。

现在,放到肉上。我注意到的是ViewPager.getChildAt(x).getLeft()的结果将具有相对于父级的某种类型的水平像素坐标。因此,我使用此信息来清除哪个视图是当前视图。

private int getCurrentPageIndex(ViewPager vp){
    int first,second,id1,id2,left;
    id1 = first = second = 99999999;
    View v;
    for ( int i = 0, k = vp.getChildCount() ; i < k ; ++i ) {
        left = vp.getChildAt(i).getLeft();
        if ( left < second ) {
            if ( left < first ) {
                second = first;
                id2 = id1;
                first = left;
                id1 = i;
            } else {
                second = left;
                id2 = i;
            }
        }
    }
    return id2;
}

这个函数可能是一个值得怀疑的黑客,因为它依赖于getLeft()的值来计算它。但是,我抓住每个孩子的左坐标。然后我将其与其他值进行比较并存储第一页和第二页,将第二页(当前页)返回到函数之外。它看起来很漂亮。

为什么(你可能会问)我不是只使用onClickListenter或其他解决方案吗?嗯,我确信有一种直接的方式可以做到这一点,而不必包括听众,其他课程,不确定的焦点和其他膨胀。不幸的是,这个解决方案并不是那么简单。但是,它确实消除了膨胀,其他类和听众。如果我能找到更直接的方法,我将重写这个功能。或许,这将为其他人提供洞察力的洞察力。