我有一个带有ViewPager的活动,它显示了一堆图片。启动时,ViewPager的位置将根据用户在上一个活动中选择的内容进行设置。类似于画廊。
我希望每次选择新页面时都会调用onPageSelected,例如,当活动第一次打开或用户滑到新页面时。
我这样设置起始点:
mPager.setCurrentItem(index);
除了在索引设置为0的情况下调用setCurrentItem之外,一切都正常,因为这不会触发onPageSelected。
mPager.setOnPageChangeListener(new OnPageChangeListener() {
@Override
public void onPageSelected(int index) {
Log.d(TAG, "onPageSelected " + index);
}
...
}
所以我的问题是:这是一个bug吗?如果是的话,我能做些什么呢?
发布于 2013-11-30 03:10:14
到目前为止,我找到的最简洁的解决方案是引用您在ViewPager上设置的onPageChangeListener (因为我不认为有ViewPager.getOnPageChangeListener()方法),然后在设置ViewPager的适配器之后,调用:
onPageChangeListener.onPageSelected(viewPager.getCurrentItem());
然而,当前索引处的页面片段还没有被实例化(至少如果您使用的是FragmentStatePagerAdapter),所以您可能需要将它包装在一个可运行的ala:
viewPager.post(new Runnable(){
@Override
public void run() {
onPageChangeListener.onPageSelected(viewPager.getCurrentItem());
}
});
此外,如果在onPageSelected处理程序中需要对片段的引用,则必须自己执行此操作。我为我的FragmentStatePagerAdapter使用了一个抽象基类,它覆盖了instantiate和destroy方法,并在SparseArray中添加/删除了片段。
发布于 2012-08-22 17:43:47
好吧,所以我还不能确定这是一个bug (或者是一个特性)。但我想我应该分享一下这个问题的可能解决方案..
编写您希望在活动中的方法中执行的功能,然后在onPageSelected方法中调用此功能。
mPager.setOnPageChangeListener(new OnPageChangeListener() {
@Override
public void onPageSelected(int index) {
myOnPageSelectedLogic(index);
}
...
}
然后就在调用
setCurrentItem(index);
在活动中,添加以下if语句
if(index == 0) {
myOnPageSelectedLogic(0);
}
它不是非常漂亮,但我希望它能帮助一些人:)
发布于 2016-09-23 06:59:20
下面的解决方案似乎对我很有效。即,当第一次加载视图寻呼机时,对于所有后续选择,无论是来自用户滚动还是来自setCurrentItem(x)调用,我在位置0处得到回调。我没有观察到任何不受欢迎的行为。
viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
if (positionOffsetPixels == 0) {
//Do something on selected page at position
}
}
@Override
public void onPageSelected(int position) {}
@Override
public void onPageScrollStateChanged(int state) {}
});
https://stackoverflow.com/questions/11794269
复制相似问题