web-dev-qa-db-fra.com

ViewPager définit la page actuelle par programme

J'ai écrit un ViewPager personnalisé pour désactiver Swipe Scroll, Mais je veux balayer par programme. J'ai trois Tab dans mon pager de vue, mais quand j'appelle viewPager.setCurrentItem(viewPager.getCurrentItem()+1) sur le premier Fragment, il passe au troisième Fragment au lieu du second Fragment. Et si j'appelle la même fonction dans le deuxième Fragment, il passe au troisième. Si j'appelle (viewPager.getCurrentItem () - 1) `dans le troisième fragment, cela fonctionne très bien en reculant. Toute aide serait appréciée. Mon code est ci-dessous:

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;
}
}

Déclaration en 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" />

L'appeler

 @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);
}
18
Abubakar Oladeji

Dans votre utilisation 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) {
        }
    });

et

    @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);

   }
16
eurosecom
viewPager.setCurrentItem(idx);

où idx est un entier basé sur 0.

36
Alp Altunel

essaye ça :

  viewPager.postDelayed(new Runnable() {

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

parfois, setCurrentItem sur viewpager ne fonctionne pas. Comme le contenu du téléavertisseur était contrôlé par un spinner. à la fois les spinners et l'état des pagers ont été restaurés sur Resume, et pour cette raison, l'écouteur spinners onItemSelected a été appelé lors du cycle de propagation d'événement suivant.

En utilisant le gestionnaire, nous pouvons faire ce travail car il définit la position actuelle du pageur après le déclenchement de l'événement onItemSelected.

4
Ajay Chauhan