ViewPager onPageSélectionné pour la première page

Il semble donc que lors de l'utilisation d'un ViewPager, l'écouteur OnPageSelected ne soit pas appelé pour la première page même problème.

J'ai une logique qui génère des éléments UI plus coûteux pour la page actuellement sélectionnée et cela fonctionne lorsque la page est modifiée, mais it doesn't work for the first page.

  • Recyclerview n'appelle aucune méthode d'adaptateur: onCreateViewHolder, onBindViewHolder,
  • Android: Google Places Autocomplete - Comment puis-je l'utiliser pour remplir un RecyclerView plutôt qu'un menu déroulant?
  • Le projet peut utiliser une version de Gradle qui ne contient pas la méthode 'compileSdkVersion ()'
  • Comment revenir au fragment précédent en appuyant sur le bouton de retour manuelle du fragment individuel?
  • Pourquoi est-il important de définir la charge utile du développeur avec la facturation dans l'application?
  • BluetoothAdapter.getDefaultAdapter () lancer RuntimeException sans être actif
  • Si je définis l'élément actuel après l'auditeur, le rappel est déclenché pour la première page, mais la vue n'a pas encore été initialisée, donc je ne peux pas la manipuler:

     // Inside PagerAdapter.instantiateItem ViewHolder vh = new ViewHolder(); cursor.moveToPosition(position); vh.view = adapter.newView(context, cursor, null); // Set position as tag so we can retrieve it with findViewByTag vh.view.setTag(position); ((ViewPager) collection).addView(vh.view,0); return vh; // Inside MyActivity.onCreate pagerAdapter = new SingleMessagePagerAdapter(this, cursor); pager = (ViewPager)findViewById(R.id.message_pager); pager.setAdapter(pagerAdapter); pager.setOnPageSelectedListener(this); pager.setCurrentItem(selectedItem); // Inside MyActivity.onPageSelected // Retrieve tagged view View view = pager.findViewWithTag(position); 

    Ici, la view finit par être nulle car PagerAdapter.instantiateItem n'a pas encore été exécuté. Donc, je suppose que ma question est, à quel moment du cycle de vie de l'activité puis-je être certain que le ViewPager a initialisé la vue? J'ai essayé de le faire dans Activity.onAttachedToWindow et Activity.onResume mais il semble que ces deux PagerAdapter.instantiateItem soient déclenchés avant PagerAdapter.instantiateItem .

  • Lecture automatique de vidéos youtube dans Android
  • Boîte de dialogue DatePicker sans visualisation du calendrier dans lollipop ?
  • Comment ouvrir le sélectionneur de musique?
  • Autoriser la notification à annuler après appeler stopForeground (faux)
  • Caractéristiques de la carte SD Android sur Samsung Galaxy
  • Utilisez la bibliothèque de support dans les projets and library android (Android Studio)
  • 3 Solutions collect form web for “ViewPager onPageSélectionné pour la première page”

    Essayez d'utiliser des fragments!

     public class SectionsPagerAdapter extends FragmentPagerAdapter { public SectionsPagerAdapter() { super(getSupportFragmentManager()); } @Override public Fragment getItem(int i) { Fragment fr = null; if (i==0) fr = new sec0frag(); else if (i==1) fr = new sec1frag(); else if (i==2) fr = new sec2frag(); return fr; } @Override public int getCount() { return 3; } } 

    Et créer 3 classes de fragments

    par exemple :

      public static class sec0frag extends Fragment { @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { // here is initialize for first time to view pages.! } } 

    Je me demande pourquoi vous n'avez pas seulement la logique que vous mentionnez dans le Fragment lui-même plutôt que l'activité d'hébergement. ViewPager tamponne quelques fragments de chaque côté de l'actuel afin qu'ils soient configurés en arrière-plan et prêts à fonctionner lorsque l'utilisateur les balaie. Mettre la logique dans onPageSelected signifierait contourner cette fonctionnalité et ne pas faire le levage lourd jusqu'à ce que l'utilisateur passe à la page.

    En supposant que, pour une raison quelconque, vous ne pouvez pas faire ce qui précède, pourquoi ne pas utiliser une interface avec une fonction de rappel . Déclenchez le rappel dans la fonction onCreateView du fragment pour permettre à l'Activité de savoir qu'elle est totalement instanciée.

    Ma solution était d'étendre l'adaptateur de téléavertisseur et de créer une interface à l'intérieur. Ensuite, faites que l'adaptateur n'appelle l'interface qu'une seule fois après avoir créé l'adaptateur. En rappel d'interface interne, vous pouvez appeler la méthode OnPageChanged sans avoir de nullpointerexception. Ajoutez cette classe à votre projet et étendez votre carte. N'oubliez pas de régler l'auditeur sur l'adaptateur avant de configurer l'adaptateur vers le programme de visualisation. Classe d'adaptateur ci-dessous:

     public abstract class ExtendedPagerAdapter extends FragmentPagerAdapter { private boolean instantiated; private AdapterListener adapterListener; public interface AdapterListener { void onAdapterInstantiated(); } public ExtendedPagerAdapter(FragmentManager fragmentManager) { this(fragmentManager, null); } public ExtendedPagerAdapter(FragmentManager fragmentManager, AdapterListener adapterListener) { super(fragmentManager); this.adapterListener = adapterListener; instantiated = false; } @Override public void finishUpdate(ViewGroup container) { super.finishUpdate(container); if (!instantiated) { instantiated = true; if (adapterListener != null) { adapterListener.onAdapterInstantiated(); } } } public void setAdapterInstantiatedListener(AdapterListener adapterListener) { this.adapterListener = adapterListener; } } 

    Code d'activité:

     adapter = new ViewPagerAdapter(getChildFragmentManager()); adapter.setAdapterInstantiatedListener(new ExtendedPagerAdapter.AdapterListener() { @Override public void onAdapterInstantiated() { onPageSelected(viewPager.getCurrentItem()); } }); viewPager.addOnPageChangeListener(this); viewPager.setAdapter(adapter); 
    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.