我知道使用Gallery小部件可以使用getSelectedItemPosition();。检索当前位置,但是ViewPager似乎没有。
我知道我可以设置一个侦听器并在切换页面时检索位置。但是我想要当前的视图位置。
Answers:
创建一个侦听器并将其设置在您的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()
更新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)
}
})
我现在告诉您它是一个黑客,因此没有理由为此投票。意思是,它要么对您有帮助,要么对您没有帮助。无论哪种方式,下面的描述都将提供一些见解并为社区提供帮助。另外,此解决方案对于没有的旧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
或使用任何解决方案?好吧,我很胆怯地确定,有一种直接的方法可以做到这一点,而不必包括听众,其他班级,不确定的焦点和其他膨胀。不幸的是,这种解决方案并非完全简单。但是,它确实消除了膨胀,其他类和听众。如果我能找到更直接的方法,我将重写此函数。或许,这将为其他人提供顿悟的见解。