web-dev-qa-db-fra.com

Position de départ de PagerAdapter

J'utilise l'exemple suivant pour implémenter mon viewPager: http://code.google.com/p/viewpagerexample/issues/list

Le problème de cet exemple est que je ne sais pas comment définir ma position de départ, la position de départ par défaut est 0. En gros, je ne peux pas contrôler si une vue est disponible à gauche ou à droite.

Existe-t-il un moyen de voir la position actuelle du centre de contrôle? y a-t-il une meilleure façon de le faire? est-il possible de le rendre circulaire?

66
Kirill Kulakov

J'ai trouvé un moyen de définir sa position, ce qui se fait en dehors de la classe:

 awesomePager = (ViewPager) findViewById(R.id.awesomepager);
 awesomePager.setAdapter(awesomeAdapter);
 awesomePager.setCurrentItem(CurrentPosition);

et il peut être limité en calculant la quantité d'éléments que je veux y intégrer

154
Kirill Kulakov

J'ai remarqué que si vous recréez Activité (changement d'orientation) avec ViewPager ayant FragmentStatePagerAdapter, l'adaptateur réutilisera ses fragments. Le moyen de l'arrêter est:

@Override
public void onSaveInstanceState(Bundle savedInstanceState) {
    if (viewPager != null) {
        // before screen rotation it's better to detach pagerAdapter from the ViewPager, so
        // pagerAdapter can remove all old fragments, so they're not reused after rotation.
        viewPager.setAdapter(null);
    }
    super.onSaveInstanceState(savedInstanceState);
}

mais après la récréation d'activité, ViewPager ouvre toujours la page 0 en premier et setCurrentItem (CurrentPosition); ne fonctionne pas. La solution pour cela est de changer de page après un délai:

new Handler().postDelayed(new Runnable() {
    @Override
    public void run() {
        viewPager.setCurrentItem(newPosition);
    }
}, 100);
17
Malachiasz

Pour commencer avec le dernier fragment, j'ai fait ceci:

PagerAdapter pagerAdapter = new PagerAdapter();
viewPager.setAdapter(pagerAdapter);
viewPager.setCurrentItem(pagerAdapter.getCount() - 1);
16
Helali

Je suis tombé sur un problème selon lequel si je définissais l'élément actuel avant de configurer l'adaptateur, le premier élément que je recevrais sera toujours celui de la position 0.

Assurez-vous de le faire:

awesomePager.setAdapter(awesomeAdapter);
awesomePager.setCurrentItem(CurrentPosition);

et pas:

awesomePager.setCurrentItem(CurrentPosition);
awesomePager.setAdapter(awesomeAdapter);
8
DaveB

J'ai un tableau de taille supérieure à 1000 et, dans une vue dynamique, je faisais face à un glissement gauche bloqué lors du premier chargement. Le code ci-dessous a résolu ce problème et a abouti à un défilement régulier:

@Override
onResume(){
   super.onResume();
   viewPager.setCurrentItem(newPosition);
}
6
Suhail k khan

J'utilise 3 fragments et au démarrage de mon application, le deuxième fragment (milie) sera affiché par défaut. J'utilise simplement la fonction onResume et tout fonctionne très bien.

@Override
protected void onResume() {
    super.onResume();
    m_viewPager.setCurrentItem(1);
}
4
Leebeedev

J'ai rencontré le même problème. Lorsque j'ai initialisé ViewPager, la position de l'indicateur était 0. Cela peut dépendre de la quantité de calcul effectuée pour le contenu du pageur. J'utilise ViewTreeObserver comme ci-dessous.

mGlobalLayoutListener = new ViewTreeObserver.OnGlobalLayoutListener() {
    @Override
    public void onGlobalLayout() {
        mViewPager.setCurrentItem(newPosition);
        removeOnGlobalLayoutListener(mSlidingTabLayout.getViewTreeObserver(), mGlobalLayoutListener);
    }
};
mSlidingLayout.getViewTreeObserver().addOnGlobalLayoutListener(mGlobalLayoutListener);

et,

private void removeOnGlobalLayoutListener(ViewTreeObserver observer, ViewTreeObserver.OnGlobalLayoutListener listener) {
       if (observer == null) return;
       if (Build.VERSION.SDK_INT < Build.VERSION_CODES.JELLY_BEAN) {
               observer.removeGlobalOnLayoutListener(listener);
       } else {
               observer.removeOnGlobalLayoutListener(listener);
       }
} 

De cette façon, ne vous inquiétez jamais non plus avec la mise à l'heure du délai.

2
chanzmao
@Override
public Object instantiateItem(ViewGroup container, int position) {
    View currentPage = null;
    switch(position){
        case 0:
            currentPage = LayoutInflater.from(context).inflate(R.layout.page0, null)    
            break;
        case 1:
            currentPage = LayoutInflater.from(context).inflate(R.layout.page1, null)    
            ///////////// This page will be default ////////////////////
            ((ViewPager)container).setCurrentItem(position);
            ////////////////////////////////////////////////////////////
            break;
        case 2:
            currentPage = LayoutInflater.from(context).inflate(R.layout.page2, null)    
            break;
    return currentPage;
}
1
Kvant