获取ViewPager的当前位置


84

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

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

Answers:


94

创建一个侦听器并将其设置在您的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;
    }
}

4
请注意,使用此方法时:从未更改视图时,getCurrentPage()将始终返回0。由于某些原因,如果您在除第一个视图之外的其他视图上输入ViewPager,则您期望的值不应该为0 ...我只是遇到了问题,因为我并不总是在第一个视图上输入视图视图。
布兰登·罗马诺

1
@Adam您能告诉我如何调用此函数

非常简单 谢谢你androidu。
whdals0


4

更新2019

现在,您可以addOnPageChangeListener在View Pager上进行设置 ,以观察Page位置的变化。

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

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

-1

我现在告诉您它是一个黑客,因此没有理由为此投票。意思是,它要么对您有帮助,要么对您没有帮助。无论哪种方式,下面的描述都将提供一些见解并为社区提供帮助。另外,此解决方案对于没有的旧API也很不错ViewPager.getCurrentItem()


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

话虽这么说,我开发了一个黑客解决方法。我不知道此功能是否可以在所有环境中正常工作,但是它对我当前的项目有效。我会怀疑是否不适合您,那么这将是不同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或使用任何解决方案?好吧,我很胆怯地确定,有一种直接的方法可以做到这一点,而不必包括听众,其他班级,不确定的焦点和其他膨胀。不幸的是,这种解决方案并非完全简单。但是,它确实消除了膨胀,其他类和听众。如果我能找到更直接的方法,我将重写此函数。或许,这将为其他人提供顿悟的见解。


1
你救了我!有一些可怕的错误。无法找到出了什么问题。主席先生,您值得赞扬!
Nursultan Talapbekov 2015年

谢谢您,先生!我想社区不会分享您的热情。
2015年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.