onPageScrolled()方法没有被调用

24

我正在尝试熟悉ViewPager。我的代码如下所示。问题在于onPageChangeListener方法没有被调用。可能的问题是什么?

public class TabsViewPagerFragmentActivity extends SherlockFragmentActivity implements ViewPager.OnPageChangeListener {


private ViewPager mViewPager;
private PagerAdapter mPagerAdapter;
private PageIndicator mIndicator;

private static final String[] CONTENT = new String[] { "Home", "Popular", "Chat", "Profile"};

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    ActionBar bar = getSupportActionBar();

    View customview = LayoutInflater.from(this).inflate(R.layout.actionbar_custom_layout, null);

    ImageView im = (ImageView)customview.findViewById(R.id.add);

    /*im.getLayoutParams().height = h;
    im.getLayoutParams().width = h;*/

    bar.setCustomView(customview);
    bar.setDisplayShowCustomEnabled(true);
    bar.setDisplayShowTitleEnabled(false);
    bar.setDisplayShowHomeEnabled(false);
    // Inflate the layout
    setContentView(R.layout.tabs_viewpager_layout);


    // Intialise ViewPager
    this.intialiseViewPager();

    mIndicator = (TitlePageIndicator)findViewById(R.id.titles);
    mIndicator.setViewPager(mViewPager);

    TitlePageIndicator indicator = (TitlePageIndicator)findViewById(R.id.titles);

    indicator.setTextColor(0xAAfb891e);
    indicator.setSelectedColor(0xFFfb891e);

}

@Override
public boolean onCreateOptionsMenu(Menu menu) {


    menu.add("Search")
        .setShowAsAction(MenuItem.SHOW_AS_ACTION_IF_ROOM | MenuItem.SHOW_AS_ACTION_WITH_TEXT);


    return true;
}



public int getCount() {
    return CONTENT.length;
}


protected void onSaveInstanceState(Bundle outState) {

    super.onSaveInstanceState(outState);
}
private void intialiseViewPager() {


    this.mPagerAdapter  = new PagerAdapter(super.getSupportFragmentManager(),
                                            fragments);

    this.mViewPager = (ViewPager)super.findViewById(R.id.viewpager);
    this.mViewPager.setAdapter(this.mPagerAdapter);
    this.mViewPager.setOnPageChangeListener(this);



}

public void onPageScrolled(int position, float positionOffset,
        int positionOffsetPixels) {
    // TODO Auto-generated method stub

    System.out.println(positionOffsetPixels);

}

public void onPageSelected(int position) {
    // TODO Auto-generated method stub

    System.out.println(position);
}


public void onPageScrollStateChanged(int state) {
    // TODO Auto-generated method stub

    System.out.println(state);

}
}

我的意思是,当我滚动页面时,在Logcat中没有任何输出。


你能否发布定义mIndicator的代码? - FoamyGuy
很抱歉,mIndicator是viewpagerindicator... 这个代码:this.mViewPager.setOnPageChangeListener(mIndicator); 最初是这样的:this.mViewPager.setOnPageChangeListener(this); 我只是为了看看会发生什么而改变了它,但那并没有帮助... - ProgrAmmar
我已经编辑了我的问题,并附上了完整的代码... - ProgrAmmar
这么难吗??... 还没有帮助的答案... :P - ProgrAmmar
4个回答

119

经过一些尝试和错误,我自己解决了这个问题。

由于我引入了一个TitlePagerIndicator 'mIndicator',所以我必须调用mIndicator.setOnPageChangeListener(this);而不是mViewPager.setOnPageChangeListener(this);。


5
谢谢,这让我省心了。但是,你可以告诉我原因吗? - Nguyen Minh Binh
9
我猜测原帖作者正在使用类似http://viewpagerindicator.com/的东西,它内部设置了`onPageChangeListener`,因此任何以编程方式设置的监听器都将被取消引用。 - Dori
是的,终于成功了。我正在使用viewpagerindicator库,监听器必须附加到指示器而不是viewpager。谢谢! - Roberto
谢谢,这很有帮助,但我想知道为什么它不能与ViewPager一起使用。 - Syed Raza Mehdi
ViewPager 只能处理一个 OnPageChangeListener。每当您调用 ViewPager.setOnPageChangeListener(...) 时,先前设置的监听器将被删除。因此,它只能是 PageIndicator 的监听器或您自定义的监听器。如果您将其设置在 PageIndicator 上,则 PageIndicator 将简单地将所有传入的监听器调用转发到您的自定义监听器,从而避免了单一监听器的限制。 - MrMaffen

2

System.out 流不会输出到 Logcat。请使用 Log 类,例如 Log.d("MyApp", "message")


我以前使用过 System.out.println() 在 logcat 中打印动态值。但是这次也会尝试一下。 - ProgrAmmar

0

从你编写的代码来看,我猜你正在实现 ViewPager.OnPageChangeListener

更改

this.mViewPager.setOnPageChangeListener(mIndicator);

this.mViewPager.setOnPageChangeListener(this);


实际上,那只是“这个”,我只是改变它来看看效果。但无论如何,将mIndicator更改为这个也没有帮助。 - ProgrAmmar

0

我遵循了ProgrAmmar的建议,但对我没有用。在我的情况下,我使用了

mIndicator.setCurrentItem(position);

它运行得很好。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接