我知道使用Gallery小部件,我可以使用getSelectedItemPosition();检索当前位置,但看起来ViewPager似乎没有。
我知道我可以设置一个监听器并在切换页面时检索位置。但我想要当前的观点位置。
答案 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()
。
首先,一点信息。如果您使用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
或其他解决方案吗?嗯,我确信有一种直接的方式可以做到这一点,而不必包括听众,其他课程,不确定的焦点和其他膨胀。不幸的是,这个解决方案并不是那么简单。但是,它确实消除了膨胀,其他类和听众。如果我能找到更直接的方法,我将重写这个功能。或许,这将为其他人提供洞察力的洞察力。