第一个项目永远不会调用OnPageSelected方法?

6
我遇到的问题是ViewPager没有调用0项的onPageSelected方法。 代码示例:
public class PagerActivity extends ActionBarActivity implements ViewPager.OnPageChangeListener {

private static final String TAG = PagerActivity.class.getCanonicalName();

private ViewPager mViewPager;

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

    setContentView(R.layout.activity_pager);
    mViewPager = (ViewPager) findViewById(R.id.view_pager);
    mViewPager.setAdapter(new ViewAdapter());
    mViewPager.setOnPageChangeListener(this);
}

@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
    Log.e(TAG, "position = " + position);

}

@Override
public void onPageSelected(int position) {
    Log.e(TAG, "selected page = " + position);

}

@Override
public void onPageScrollStateChanged(int state) {
    Log.e(TAG, "state = " + state);

}

private class ViewAdapter extends PagerAdapter {

    @Override
    public int getCount() {
        return 5;
    }

    @Override
    public boolean isViewFromObject(View view, Object object) {
        return view == object;
    }

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        ViewGroup viewGroup = (ViewGroup) LayoutInflater.from(container.getContext())
                .inflate(R.layout.view_pager_item, container, false);
        TextView textView = (TextView) viewGroup.findViewById(R.id.page_indicator);
        textView.setText("Page position = " + position);
        container.addView(viewGroup);
        return viewGroup;
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        container.removeView((ViewGroup) object);
    }
}

我没有与此相关的具体任务,只是想知道:

  • 这是否是已知的问题,有什么最佳解决方案?

  • 这是否只是按照设计方式工作的?

1个回答

2
OnPageChangeListener 下添加此内容。
pageChangeListener.onPageSelected(0); //Set start to 0 page

在您的情况下:

PagerActivity.onPageSelected(0);

然而,你应该从类中删除 implements ViewPager.OnPageChangeListener 并添加以下内容:
OnPageChangeListener pageChangeListener = new OnPageChangeListener() {
    @Override
    public void onPageScrollStateChanged(int arg0) { }

    @Override
    public void onPageScrolled(int arg0, float arg1, int arg2) { }

    @Override
    public void onPageSelected(int position) {

        switch (position) {
        case 0: 
                Log.e(TAG, "selected page = " + position);
            break;

        default:

                Log.e(TAG, "selected page = " + position);
            break;
        }
    }
});
mViewPager.setOnPageChangeListener(pageChangeListener);
pageChangeListener.onPageSelected(0);

那你的意思是在初始化之前自己设置位置? - Yurii Tsap
是的...@YuriiTsap 尝试使用pageChangeListener的完整代码,应该可以工作。 - Michele Lacorte
我可以在实例化方法中添加一个检查,如果(position==0),则调用onPageSelected(0),但对我来说这不够优雅。 - Yurii Tsap
不要从类中取消实现,而是在上面添加代码,然后您就不需要检查位置,它从0开始。 - Michele Lacorte
它肯定能工作,但它并没有解释第0个元素的问题。如之前所问:这是预期行为吗? - Yurii Tsap
2
正如我之前提到的,如果你需要在初始化页面项时进行逻辑操作,你也可以在instantiateItem方法中使用if语句。但这种解决方案只是一种权宜之计,你的方法非常有帮助。谢谢。 - Yurii Tsap

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