Android ViewPager lançant l'exception IndexOutOfBounds lors du réglage de l'élément / page courant

J'ai un ViewPager avec trois éléments. J'essaie de configurer le ViewPager pour afficher la page la plus à droite (ce qui serait le 2ème élément). Cela renvoie une exception IndexOutOfBounds, mais je sais que l'index devrait être en limites. Voici la pile exacte:

02-22 12:22:50.256: E/AndroidRuntime(384): FATAL EXCEPTION: main 02-22 12:22:50.256: E/AndroidRuntime(384): java.lang.IndexOutOfBoundsException: index=1 count=0 02-22 12:22:50.256: E/AndroidRuntime(384): at android.view.ViewGroup.addInArray(ViewGroup.java:2050) 02-22 12:22:50.256: E/AndroidRuntime(384): at android.view.ViewGroup.addViewInner(ViewGroup.java:1994) 02-22 12:22:50.256: E/AndroidRuntime(384): at android.view.ViewGroup.addViewInLayout(ViewGroup.java:1958) 02-22 12:22:50.256: E/AndroidRuntime(384): at android.view.ViewGroup.addViewInLayout(ViewGroup.java:1939) 02-22 12:22:50.256: E/AndroidRuntime(384): at android.support.v4.view.ViewPager.addView(ViewPager.java:917) 02-22 12:22:50.256: E/AndroidRuntime(384): at android.view.ViewGroup.addView(ViewGroup.java:1828) 02-22 12:22:50.256: E/AndroidRuntime(384): at us.tagverse.pagertest.MasterActivity$PAdapter.instantiateItem(MasterActivity.java:518) 02-22 12:22:50.256: E/AndroidRuntime(384): at android.support.v4.view.PagerAdapter.instantiateItem(PagerAdapter.java:110) 02-22 12:22:50.256: E/AndroidRuntime(384): at android.support.v4.view.ViewPager.addNewItem(ViewPager.java:649) 02-22 12:22:50.256: E/AndroidRuntime(384): at android.support.v4.view.ViewPager.populate(ViewPager.java:783) 02-22 12:22:50.256: E/AndroidRuntime(384): at android.support.v4.view.ViewPager.onMeasure(ViewPager.java:1016) 02-22 12:22:50.256: E/AndroidRuntime(384): at android.view.View.measure(View.java:8313) 02-22 12:22:50.256: E/AndroidRuntime(384): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138) 02-22 12:22:50.256: E/AndroidRuntime(384): at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1017) 02-22 12:22:50.256: E/AndroidRuntime(384): at android.widget.LinearLayout.measureVertical(LinearLayout.java:386) 02-22 12:22:50.256: E/AndroidRuntime(384): at android.widget.LinearLayout.onMeasure(LinearLayout.java:309) 02-22 12:22:50.256: E/AndroidRuntime(384): at android.view.View.measure(View.java:8313) 02-22 12:22:50.256: E/AndroidRuntime(384): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138) 02-22 12:22:50.256: E/AndroidRuntime(384): at android.widget.FrameLayout.onMeasure(FrameLayout.java:250) 02-22 12:22:50.256: E/AndroidRuntime(384): at android.view.View.measure(View.java:8313) 02-22 12:22:50.256: E/AndroidRuntime(384): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:3138) 02-22 12:22:50.256: E/AndroidRuntime(384): at android.widget.FrameLayout.onMeasure(FrameLayout.java:250) 02-22 12:22:50.256: E/AndroidRuntime(384): at android.view.View.measure(View.java:8313) 02-22 12:22:50.256: E/AndroidRuntime(384): at android.view.ViewRoot.performTraversals(ViewRoot.java:839) 02-22 12:22:50.256: E/AndroidRuntime(384): at android.view.ViewRoot.handleMessage(ViewRoot.java:1859) 02-22 12:22:50.256: E/AndroidRuntime(384): at android.os.Handler.dispatchMessage(Handler.java:99) 02-22 12:22:50.256: E/AndroidRuntime(384): at android.os.Looper.loop(Looper.java:123) 02-22 12:22:50.256: E/AndroidRuntime(384): at android.app.ActivityThread.main(ActivityThread.java:3683) 02-22 12:22:50.256: E/AndroidRuntime(384): at java.lang.reflect.Method.invokeNative(Native Method) 02-22 12:22:50.256: E/AndroidRuntime(384): at java.lang.reflect.Method.invoke(Method.java:507) 02-22 12:22:50.256: E/AndroidRuntime(384): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839) 02-22 12:22:50.256: E/AndroidRuntime(384): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597) 02-22 12:22:50.256: E/AndroidRuntime(384): at dalvik.system.NativeStart.main(Native Method) 

Notez que la cause est java.lang.IndexOutOfBoundsException: index=1 count=0 . Cela impliquerait que le nombre de pages / éléments est 0 et l'index que je demande est 1. Aucune de ces choses n'est vraie. Voici comment j'appelle mon ViewPager et demande la page donnée:

  • À quoi sert l'attribut mimeType dans <data>?
  • Intégration en hébreu Android (RTL)
  • Bloquer / désactiver le bouton des applications récentes
  • Comment lire le fichier image stocké dans la mémoire interne?
  • Caractères spéciaux dans Android sms
  • Varargs Kotlin Java interop ne fonctionne pas correctement
  •  ViewPager pager = (ViewPager) findViewById(R.id.ma_viewcontainer); PAdapter adapter = new PAdapter(); pager.setAdapter(adapter); pager.setCurrentItem(2); 

    Notez que cet appel n'émet aucune erreur et règle correctement l'élément actuel sur l'élément du milieu (index 1):

     ViewPager pager = (ViewPager) findViewById(R.id.ma_viewcontainer); PAdapter adapter = new PAdapter(); pager.setAdapter(adapter); pager.setCurrentItem(1); 

    J'ai un compte de 3 éléments dans le téléavertisseur de vue. Voici ma classe PAdapter complète, qui étend la classe PagerAdapter:

     private class PAdapter extends PagerAdapter implements TitleProvider { private int COUNT = 3; private static final int SETTINGS_ACTIVITY = 0; private static final int MAIN_ACTIVITY = 1; private static final int FRIEND_LIST_ACTIVITY = 2; @Override public int getCount() { return COUNT; } @Override public Object instantiateItem(View collection, int position) { LinearLayout layout = new LinearLayout(getApplicationContext()); LayoutInflater inflater = (LayoutInflater) getApplicationContext().getSystemService(Context.LAYOUT_INFLATER_SERVICE); switch(position) { case MAIN_ACTIVITY : layout = (LinearLayout) inflater.inflate(R.layout.main, null, false); initMainLayout(layout); break; case SETTINGS_ACTIVITY : layout = (LinearLayout) inflater.inflate(R.layout.settings, null, false); initSettingsLayout(layout); break; case FRIEND_LIST_ACTIVITY : layout = (LinearLayout) inflater.inflate(R.layout.friend_list, null, false); initFriendListLayout(layout); break; } ((ViewPager)collection).addView(layout, position); return layout; } @Override public void destroyItem(View collection, int position, Object view) { ((ViewPager)collection).removeView((LinearLayout)view); } @Override public boolean isViewFromObject(View v, Object o) { return v == (LinearLayout)o; } @Override public void finishUpdate(View arg0) { //no need } @Override public void restoreState(Parcelable arg0, ClassLoader arg1) { //no need } @Override public Parcelable saveState() { return null; } @Override public void startUpdate(View arg0) { //no need } @Override public String getTitle(int position) { Resources res = getApplicationContext().getResources(); switch(position) { case MAIN_ACTIVITY : return res.getString(R.string.app_name); case SETTINGS_ACTIVITY : return res.getString(R.string.settings); case FRIEND_LIST_ACTIVITY : return res.getString(R.string.friend_list); default : return null; } } } 

    La ligne ((ViewPager)collection).addView(layout, position); Provoque le crash.

    Comme vous pouvez le voir, trois éléments. L'utilisation de setCurrentItem () avec un paramètre de 0 ou 1 fonctionne très bien, mais 2 provoque cette étrange erreur. J'ai manqué d'idées pour le résoudre … Malheureusement, ViewPager réside dans certaines eaux inexplorées d'Android, il semble. Si quelqu'un a une idée de la façon de résoudre ce problème, il serait très apprécié. Merci!

    EDIT: Selon la suggestion de Shereef, j'ai essayé d'enregistrer le nombre d'enfants par collection.getChildCount () et obtenu le résultat suivant:

     02-22 15:20:42.274: E/children count(645): count: 0 02-22 15:20:42.454: E/children count(645): count: 1 02-22 15:20:42.594: E/children count(645): count: 2 

    C'est intéressant. Ce que cela me dit, c'est qu'il crée un PagerAdapter vide et les ajoute un à la fois. instantiateItem() est appelé 3 fois pour les trois vues visibles (centre, gauche et droite). J'ai donc ajouté ce bloc de code dans la méthode instantiateItem() :

     if(((ViewPager)collection).getChildCount() == 2) { ((ViewPager)collection).setCurrentItem(2); } 

    Donc, seulement si le compte est établi pour être 2, cela définira-t-il la page sur 2 (il s'agit d'une solution de piratage qui ne répond pas complètement au problème, mais valait la peine d'essayer). J'ai eu une pile d'erreurs similaire qui a indiqué d'abord la ligne: ((ViewPager)collection).setCurrentItem(2); , Puis ((ViewPager)collection).addView(layout, position); .

    J'espère que cela aide à donner une idée.

  • Comment obtenir la luminosité de l'écran actuel dans le code Android dynamiquement?
  • Retenir "<sdk> / extras / google / google_play_services / libproject" après la mise à jour de la révision 30
  • Faire pivoter un bitmap en utilisant le script de rendu android
  • Android: Détection lorsque ScrollView atteint le bas
  • Pourquoi l'interface OnProgressUpdate () de AsyncTask <> n'est-elle jamais appelée?
  • Évitez l'apk craqué
  • 2 Solutions collect form web for “Android ViewPager lançant l'exception IndexOutOfBounds lors du réglage de l'élément / page courant”

    Je ne pense pas que vous pouvez simplement faire ((ViewPager)collection).addView(layout, position) . Cela dépend de votre limite de page hors écran, qui par défaut est 1, je crois. Je suppose que vous n'utilisez que 3 vues, donc vous pouvez faire quelque chose comme viewPager.setOffscreenPageLimit(3); Dans votre `onCreate (ou partout où vous avez placé votre appel) pour éviter que chaque vue soit actualisée chaque fois que vous le quittez.

    Vous verrez dans quelques tutoriels qui ((ViewPager) collection).addView(view, 0); Est utilisé dans instantiateItem() . J'ai travaillé un peu avec ViewPagers au cours des dernières semaines, et en utilisant 0 comme position, tout le temps semble fonctionner très bien.

    Je vois le journal des accidents, je vois qu'il se bloque dans l'élément instancier. Je ne sais pas quelle ligne exactement parce que je n'ai pas vos numéros de ligne

    Mais si j'étais un homme de paris, je pari que:

      ((ViewPager)collection).addView(layout, position); 

    Crashes pour essayer d'ajouter la vue à la position 1 alors qu'il n'y a pas de pages dans la collection Peut-être vérifier la collection.getchildcount() (peut-être que le nom de la méthode est fausse) et insérer à max (position, compter)

    C'est-à-dire remplacer la position par:

     count > position ? position : count 

    MODIFIER:

     ((ViewPager)collection).addView(layout, ((ViewPager)collection).getChildCount() > position ? position : ((ViewPager)collection).getChildCount()) 

    Ps Publier depuis mon téléphone désolé pour l'horrible formatage

    Veuillez noter

      02-22 12:22:50.256: E/AndroidRuntime(384): at us.tagverse.pagertest.MasterActivity$PAdapter.instantiat MasterActivity.java:518 

    Le numéro à la fin de la ligne, j'ai copié et découvrez quelle ligne est alors et seulement alors, vous saurez quelle ligne a eu le crash

    EDIT: PS sur votre solution

    Je pense que votre solution ne définit que l'élément actuel après que les 3 pages ont été instanciées par un élément instancier, mais ma ligne le permettrait même si elles n'avaient pas été instanciées.

    coAndroid est un fan Android de Google, tout sur les téléphones Android, Android Wear, Android Dev et Android Games Apps.