2012-05-10 2 views
3

Dans mon application, j'essaie d'implémenter une vue de carte dans un ViewPager. J'ai 4 pages différentes dans l'application. et MapView est dans la 4ème page. J'ai réussi à charger la carte, mais lorsque je retourne à la première page, la quatrième vue doit être détruite en utilisant la méthode destroyItem(). Et si je balayez pour la 4ème page, il se bloque à partir du 3 page indiquant une erreur dans le logcat:MapView n'est pas supprimé de ViewPager?

05-10 13:14:50.152: E/AndroidRuntime(620): java.lang.IllegalStateException: You are only allowed to have a single MapView in a MapActivity 

Im conscient d'avoir une seule MapView dans un MapActivity. Mais je ne suis pas capable de le résoudre - quelqu'un peut-il m'aider?

code est ci-dessous:

public Object instantiateItem(View collection, int position) { 

    LayoutInflater inflater = (LayoutInflater) collection.getContext() 
     .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
    context = collection.getContext(); 
    int resId = 0; 
    int flag = resId; 
    switch (position) { 
    case 0: 
     resId = R.layout.farleft; // first 
     view = inflater.inflate(resId, null); 

     break; 
    case 1: 
     resId = R.layout.left; // second 
     view = inflater.inflate(resId, null); 

     break; 
    case 2: 
     resId = R.layout.right; // third 
     view = inflater.inflate(resId, null); 

     break; 
    case 3: 
     resId = R.layout.mylocator; 
     view = inflater.inflate(resId, null); 
     break; 

    } 
    ((ViewPager) collection).addView(view, 0); 

    return view; 
} 

@Override 
public void destroyItem(View arg0, int arg1, Object arg2) { 

    ((ViewPager) arg0).removeView((View) arg2); 
    Log.d("destroyItem", "" + arg2); 
} 

Répondre

0

Un problème avec Android View Pager est que le recyclage des vues doit être fait manuellement. Dans votre cas, il est possible que la vue n'ait pas encore été détruite mais soit créée une seconde fois lorsque la vue est à nouveau instanciée. Vous pouvez enregistrer votre vue pour chaque page et la renvoyer dans instantiateItem si elle n'a pas déjà été détruite.

+1

pourrait u s'il vous plaît me aider un exemple de code? –

+0

J'ai le même problème, et j'ai essayé ceci avec @Seppl réponse sans succès: HashMap itemList; objet instantiateItem public (conteneur ViewGroup, int position) { \t \t si { \t \t \t retour itemList.get (position) (itemList.get (position)! = Null); \t \t} \t \t Object viewGroup = super.instantiateItem (conteneur, position); \t \t \t \t itemList.put (position, viewGroup); \t \t \t \t return viewGroupe; EDIT: Comment mettre en forme du code dans un commentaire? –

1

J'ai trouvé la solution. l'intérieur de votre fragment qui contient la carte et qui est utilisé par le ViewPager, mettez:

private View myView; 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 

    if (this.myView == null){ 
     this.myView = inflater.inflate(R.layout.my_layout, container, false); 
    } 
    else if (this.myView.getParent() != null) { 
     FrameLayout parentView = (FrameLayout) this.myView.getParent(); 
     parentView.removeView(this.myView); 
    } 

    return this.myView; 

} 

Il fonctionne bien pour moi, dites-moi si cela fonctionne pour vous;)