ViewPager编程设置当前页面

44

我编写了一个自定义的ViewPager来禁用Swipe Scroll,但我想以编程方式进行滑动。我的视图页中有三个Tab,但是当我在第一个Fragment上调用viewPager.setCurrentItem(viewPager.getCurrentItem()+1)时,它会移动到第三个Fragment而不是第二个Fragment。如果我在第二个Fragment中调用相同的函数,它会进入第三个Fragment。如果我在第三个Fragment中调用(viewPager.getCurrentItem()-1),则可以通过后退正常工作。任何帮助将不胜感激。以下是我的代码:

NonSwipeAbleViewPager

public class NonSwipeableViewPager extends ViewPager {

private boolean swipeable;

public NonSwipeableViewPager(Context context, AttributeSet attrs) {
    super(context, attrs);
    TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.MyViewPager);
    try {
        swipeable = a.getBoolean(R.styleable.MyViewPager_swipeable, true);
    } finally {
        a.recycle();
    }
}

@Override
public boolean onInterceptTouchEvent(MotionEvent event) {
    return swipeable ? super.onInterceptTouchEvent(event) : false;
}

@Override
public boolean onTouchEvent(MotionEvent event) {
    return swipeable ? super.onTouchEvent(event) : false;
}
}

XML中的声明

<co.example.customview.NonSwipeableViewPager
    android:id="@+id/pager"
    android:layout_width="match_parent"
    android:layout_height="0dp"
    android:layout_weight="1"
    app:swipeable="false" />

称之为

 @Override
public boolean onOptionsItemSelected(MenuItem item) {
    switch (item.getItemId()) {
        case R.id.menuNext:
            NonSwipeableViewPager pages = (NonSwipeableViewPager) getActivity().findViewById(R.id.pager);
            pages.setCurrentItem(pages.getCurrentItem()+1, true);
            break;
        default:
            return super.onOptionsItemSelected(item);
    }
    return super.onOptionsItemSelected(item);
}

我记得以前在这样的情况下工作时遇到过一些类似的怪异问题。我只是想不起来当时的解决方法是什么了。 - Jay Snayder
你尝试过将语句分开吗?int currentItem = pages.getCurrentItem(); currentItem++; pages.setCurrentItem(currentItem); - John P.
@JohnP。同样的事情。移动到第三页。 - Tonespy
如果您不希望 ViewPager 可以滑动,为什么不考虑使用 ViewSwitcher 或者 ViewFlipper 呢? - frogatto
@ItuokeAjanlekoko 您所说的 Tab 是什么意思?ViewFlipperViewSwitcher 用于在其中切换附加在其上的多个视图。 - frogatto
显示剩余5条评论
3个回答

90
viewPager.setCurrentItem(idx);

其中idx是基于0的整数。


2
问题是 ViewPager编程设置当前页面,因此这应该是被接受的答案! - Yahya

37

试试这个:

  viewPager.postDelayed(new Runnable() {

    @Override
    public void run() {
        viewPager.setCurrentItem(position);
    }
}, 10);

有时候,ViewPager 的 setCurrentItem 方法不起作用。因为 ViewPager 的内容受 Spinner 控制。在 onResume 方法中会恢复 Spinner 和 ViewPager 的状态,因此下一个事件传播周期中 Spinner 的 onItemSelected 监听器就会被调用。

使用 Handler 可以解决这个问题,因为它可以在 onItemSelected 事件触发后设置 ViewPager 的当前位置。


1
浪费了一个小时试图找出为什么setCurrentItem会在同一页上显示两个片段。这个修复了它! - Maximvs
没有这个额外的延迟,"setCurrentItem" 不起作用。 - RAINA

33
在你的 PagerActivity 中使用:
    viewPager = (ViewPager) findViewById(R.id.view_pager);
    viewPager.setOnPageChangeListener(new ViewPager.OnPageChangeListener() {
        @Override
        public void onPageSelected(int position) {
            int pagei = position + 1;
            pages=pagei + "";

            Toast.makeText(PagerActivity.this, getString(R.string.changeinfopage) + " " + pages, Toast.LENGTH_SHORT).show();
        }

        @Override
        public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
        }

        @Override
        public void onPageScrollStateChanged(int state) {
        }
    });

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {


        switch (item.getItemId()) {

            case R.id.action_previous:

                viewPager.setCurrentItem(viewPager.getCurrentItem() - 1);
                return true;

            case R.id.action_next:

                viewPager.setCurrentItem(viewPager.getCurrentItem() + 1);
                return true;
        }

        return super.onOptionsItemSelected(item);

   }

有没有任何方法可以使它动起来? - jack_the_beast

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