2013-09-23 3 views
2

J'ai besoin d'afficher un ViewPager affichant initialement une seule vue. Une fois que cette vue est passée à travers la mesure &, selon le résultat, il se peut que vous deviez modifier le contenu de l'adaptateur. Ce faisant, je suis tombé sur un scénario où le ViewPager ne suivrait pas son mouvement tout en essayant de glisser vers l'élément suivant à partir d'une certaine position.
Je suis sûr que je fais quelque chose de mal dans ma mise en œuvre de l'adaptateur, mais je ne peux pas pointer du doigt le problème. Par souci de démonstration, j'ai créé un adaptateur fictif qui imitera ce qui se passe sur mon projet actuel. Afin de reproduire le problème, essayez de balayer tout le chemin jusqu'à la position 2 (3ème élément), le résultat est que vous ne pouvez pas dépasser la position 1 (2ème élément).Appel de notifyDataSetChanged à partir de instantiateItem()

Merci!

public class CustomAdapter extends PagerAdapter { 
    int pages = 0; 

    @Override 
    public int getCount() { 
     return pages; 
    } 

    @Override 
    public boolean isViewFromObject(View view, Object o) { 
     return view == o; 
    } 

    public void setPages(int x) { 
     this.pages = x; 
    } 

    @Override 
    public Object instantiateItem(ViewGroup container, int position) { 
     TextView tv = new TextView(MainActivity.this); 
     ViewGroup.LayoutParams lp = 
       new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, 
         ViewGroup.LayoutParams.WRAP_CONTENT); 

     tv.setLayoutParams(lp); 
     tv.setText("Position: " + position); 

     if (position == 0 && pages == 1) { 
      setPages(2); 
      notifyDataSetChanged(); 
     } 
     if (position == 1 && pages == 2) { 
      setPages(3); 
      notifyDataSetChanged(); 
     } 

     container.addView(tv); 
     return tv; 
    } 

    @Override 
    public void destroyItem(ViewGroup container, int position, Object object) { 
     container.removeView((View) object); 
    } 
} 

Activité (onCreate environ):

CustomAdapter adapter = new CustomAdapter(); 
    adapter.setPages(1); 
    vp.setAdapter(adapter); 
    adapter.notifyDataSetChanged(); 

Répondre

2

méthode item instantiateItem est mauvais endroit pour le faire. parce qu'il ne fonctionne que pour une vue, il fonctionne pour 3 vues en même temps.

essayez de déplacer

if (position == 0 && pages == 1) { 
     setPages(2); 
     notifyDataSetChanged(); 
    } 
    if (position == 1 && pages == 2) { 
     setPages(3); 
     notifyDataSetChanged(); 
    } 

dans setPrimaryItem Méthode

MISE À JOUR:

Essayez d'appeler instantiateItem méthode pour la position que vous voulez dans la méthode setPrimaryItem. Vous pouvez le faire puisque instantiateItem est une méthode public.Mais je n'ai aucune idée de comment cela va fonctionner c'est une théorie. Essayez-le.

+0

La méthode instantiateItem ne peut pas appeler la deuxième fois comment résoudre ce problème? –