获取ViewPager的当前位置

我知道与图库小部件我能够使用getSelectedItemPosition(); 检索当前的位置,但它似乎并没有ViewPager有。

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

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

您可以使用:

 mViewPager.getCurrentItem() 

那么,对于那些真正关注的人来说……我以前的解决scheme实际上并没有工作。 所以我删除它,并提出了一个似乎很好的黑客! 大声笑!

没有理由downvote这个我现在告诉你它的黑客。 这意味着或者将有助于你具体与否。 无论哪种方式下面的描述将提供一些见解。 对社区有帮助。

首先是一点信息。 如果使用ViewPager.getChildAt(x);遍历ViewPager的所有子项ViewPager.getChildAt(x); 并用toString() (或getLeft() )打印出每个子视图(一个页面),然后每次更改页面时都会执行此操作,您将会注意到,当您启动时,子项将不会按照它们显示的逻辑顺序返回页面(分页回到开始)。 显然,它会从数组中删除不需要的子项,然后将最新的子项添加到数组中。 所以,比如说,让我们说你正在看第2页然后改成第3页,你的子表的列表就会按照这个顺序排列page 2, page 3, page 4含义,即ViewPager.getChildAt(1); 将返回当前页面。 但是,如果你回到第2页(从第3页开始),你的孩子列表将按照这个顺序, page 2, page 3, page 1这意味着ViewPager.getChildAt(1); 不会返回当前页面。 我还没有find简单的逻辑来清除使用这些信息的当前页面。 因为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或任何解决scheme? 那么,我确定,有一个直接的方法来做到这一点,而不必包括听众,其他类,不确定的焦点,和其他的膨胀。 不幸的是,这个解决scheme并不是直截了当的。 但是,它确实消除了膨胀,其他阶层和听众。 如果我能找出一个更直接的方法,我会重写这个函数。 或者,也许,这将提供洞察力让别人有一个顿悟。