首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >调用setCurrentItem(0)时不触发onPageSelected

调用setCurrentItem(0)时不触发onPageSelected
EN

Stack Overflow用户
提问于 2012-08-03 18:51:30
回答 9查看 37.5K关注 0票数 67

我有一个带有ViewPager的活动,它显示了一堆图片。启动时,ViewPager的位置将根据用户在上一个活动中选择的内容进行设置。类似于画廊。

我希望每次选择新页面时都会调用onPageSelected,例如,当活动第一次打开或用户滑到新页面时。

我这样设置起始点:

代码语言:javascript
复制
 mPager.setCurrentItem(index);

除了在索引设置为0的情况下调用setCurrentItem之外,一切都正常,因为这不会触发onPageSelected。

代码语言:javascript
复制
mPager.setOnPageChangeListener(new OnPageChangeListener() {
  @Override
  public void onPageSelected(int index) {
    Log.d(TAG, "onPageSelected " + index);
  }
  ...
}

所以我的问题是:这是一个bug吗?如果是的话,我能做些什么呢?

EN

回答 9

Stack Overflow用户

回答已采纳

发布于 2013-11-30 03:10:14

到目前为止,我找到的最简洁的解决方案是引用您在ViewPager上设置的onPageChangeListener (因为我不认为有ViewPager.getOnPageChangeListener()方法),然后在设置ViewPager的适配器之后,调用:

代码语言:javascript
复制
onPageChangeListener.onPageSelected(viewPager.getCurrentItem());

然而,当前索引处的页面片段还没有被实例化(至少如果您使用的是FragmentStatePagerAdapter),所以您可能需要将它包装在一个可运行的ala:

代码语言:javascript
复制
viewPager.post(new Runnable(){
@Override
    public void run() {
        onPageChangeListener.onPageSelected(viewPager.getCurrentItem());
    }
});

此外,如果在onPageSelected处理程序中需要对片段的引用,则必须自己执行此操作。我为我的FragmentStatePagerAdapter使用了一个抽象基类,它覆盖了instantiate和destroy方法,并在SparseArray中添加/删除了片段。

票数 87
EN

Stack Overflow用户

发布于 2012-08-22 17:43:47

好吧,所以我还不能确定这是一个bug (或者是一个特性)。但我想我应该分享一下这个问题的可能解决方案..

编写您希望在活动中的方法中执行的功能,然后在onPageSelected方法中调用此功能。

代码语言:javascript
复制
mPager.setOnPageChangeListener(new OnPageChangeListener() {
    @Override
    public void onPageSelected(int index) {
        myOnPageSelectedLogic(index);
    }
    ...
}

然后就在调用

代码语言:javascript
复制
setCurrentItem(index);

在活动中,添加以下if语句

代码语言:javascript
复制
if(index == 0) {
    myOnPageSelectedLogic(0);
}

它不是非常漂亮,但我希望它能帮助一些人:)

票数 35
EN

Stack Overflow用户

发布于 2016-09-23 06:59:20

下面的解决方案似乎对我很有效。即,当第一次加载视图寻呼机时,对于所有后续选择,无论是来自用户滚动还是来自setCurrentItem(x)调用,我在位置0处得到回调。我没有观察到任何不受欢迎的行为。

代码语言:javascript
复制
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) {}
        });
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11794269

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档