InstantiateItem dans PagerAdapter et AddView dans ViewPager confusion

Jusqu'à présent, j'ai piraté des exemples pour avoir une idée des API du SDK d'Anfroid dans son ensemble. Cependant, j'ai frappé une impasse.

J'essaie d'infirmer un LinearLayout avec 2 TextViews à partir d'un fichier XML. Ce sera alors des vues paginées. Je ne peux tout simplement pas travailler et je sais que je ne comprend absolument pas ce qui se passe avec le code.

  • Détecter la visibilité de la barre d'état / TYPE_SYSTEM_OVERLAY ne pas redimensionner automatiquement
  • Android: comment étirer une image sur la largeur de l'écran tout en maintenant le rapport d'aspect?
  • Qu'est-ce que setContentView (R.layout.main)?
  • Couleur de l'arrière-plan Android LinearLayout Selector
  • Les flancs d'évanouissement de l'Android ne fonctionnent pas
  • Orientation de l'écran de verrouillage (Android)
  • En regardant la source, je peux voir que la méthode ViewPager.addNewItem appelle InstantiateItem à partir de l'adaptateur fourni. Et addNewItem est appelé en population (). Peuplé est appelé dans un certain nombre d'autres endroits.

    Quoi qu'il en soit, dans l'exemple que j'ai vu lorsque la méthode est remplacée par PagerAdapter, vous devez inclure un appel à AddView sur le collège ViewPager qui est transmis depuis le viewpager comme argument.

    Si je souhaite ajouter plusieurs vues, je pensais que ce serait un cas d'appeler addView plus d'une fois, mais comme instantiateItem renvoie un objet à ViewPager (dans l'exemple, j'ai renvoyé la vue qu'il a ajouté) Je ne sais pas quoi retourner . J'ai essayé de retourner la vue gonflable et un certain nombre d'autres choses.

    Quelqu'un peut-il expliquer ce qui se passe ici?

    Très appréciée.

    M

    @Override public Object instantiateItem(View collection, int position) { layout = inflater.inflate(R.layout.animallayout, null); TextView tv = (TextView) layout.findViewById(R.id.textView1); tv.setText("1________________>" + position); TextView tv2 = (TextView) layout.findViewById(R.id.textView2); tv.setText("2________________>" + position); ((ViewPager) collection).addView(layout); return layout; } 

  • Comment puis-je implanter un balayage entre les onglets sur Android?
  • ViewPager avec WebView permettant de balayer et de ne pas autoriser le défilement de WebView
  • Désactivation de l'animation dans ViewPager
  • Mise en œuvre du défilement circulaire dans PagerAdapter
  • Android ViewPager avec les pages précédentes et suivantes visible?
  • Adaptateur de changement de vue Android
  • 2 Solutions collect form web for “InstantiateItem dans PagerAdapter et AddView dans ViewPager confusion”

    J'ai récemment implémenté ceci et c'est ma méthode instantiateItem (rendue un peu minime pour la lisibilité.

     @Override public Object instantiateItem(View collection, int position) { Evaluation evaluation = evaluations.get(position); View layout = inflater.inflate(R.layout.layout_evaluation, null); TextView evaluationSummary = (TextView) layout.findViewById(R.id.evaluation_summary); evaluationSummary.setText(evaluation.getEvaluationSummary()); ((ViewPager) collection).addView(layout); return layout; } @Override public void destroyItem(View collection, int position, Object view) { ((ViewPager) collection).removeView((View) view); } @Override public boolean isViewFromObject(View view, Object object) { return view == object; } 

    Donc, pour la page qui s'affiche, j'obtiens les données de ma liste d' evaluations utilisant le poste comme indice. Ensuite, gonflez la Layout qui a les vues, je vais ajouter mes données aussi. Ensuite, j'obtiens TextView pour définir le texte de synthèse d'évaluation. Ensuite, toute la Layout est ajoutée au ViewPager . Et finalement, la Layout est également retournée.

    Si vous ne pouvez toujours pas l'afficher, postez votre code.

    J'ai le même malentendu sur la façon dont cette carte fonctionne et j'ai fait une enquête.
    La particularité principale est que vos vues sont stockées en deux endroits:
    1 dans ViewPager, vous les ajoutez en appelant le ((ViewPager) container).addView(view); (Ici vous devez enregistrer seulement trois vues, ce que vous voyez et à gauche et à droite des quartiers)
    2 en version private final ArrayList<ItemInfo> mItems = new ArrayList<ItemInfo>(); Ceci est membre de ViewPager, il existe des vues stockées avec des informations sur leur position (elles sont ajoutées ici en appelant la méthode de l'adaptateur mAdapter.instantiateItem(this, position); )

     static class ItemInfo { Object object; int position; boolean scrolling; float widthFactor; float offset; } 

    Lorsque vous glisse, ViewPager obtient la position de vue à partir de la mItems de mItems ou l'instancie et compare cette vue avec les enfants de ViewPager avec la méthode des adaptateurs public boolean isViewFromObject(View view, Object object) . La vue qui est égale à l' object est affichée pour l'utilisateur sur ViewPager . S'il n'y a pas de vue, l'écran vide s'affiche.
    Voici la méthode ViewPager où la vue est comparée à l'objet:

     ItemInfo infoForChild(View child) { for (int i=0; i<mItems.size(); i++) { ItemInfo ii = mItems.get(i); if (mAdapter.isViewFromObject(child, ii.object)) { return ii; } } return null; } 

    Si la position des vues à partir de mItems n'est pas dans la plage {currentposition -1, currentposition +1} puis elle sera détruite:

     mItems.remove(itemIndex); mAdapter.destroyItem(this, pos, ii.object); 

    La vue de la mémoire ViewPagers 1

    C'est un piège avec destroyItem lorsque vous glisse vers l'avant, c'est appelé destroyItem , puis un nouvel élément est ajouté, mais lorsque vous faites glisser vers l'arrière en premier, vous destroyItem nouvel élément puis l'ancien est détruit. Si vous essayez d'utiliser uniquement trois vues en cache, vous pouvez obtenir IllegalStateException: The specified child already has a parent. Tout en glissant vers l'arrière.

    Mémoire ViewPager

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