2010-10-30 17 views
1

J'essaie de stocker drawables dans un SoftReferenceMap statique pour un ListView contenant des barres de progression dans chaque ligne. Chaque ligne a une progression différente, mais quand je la mets à travers setProgress (int) toutes les lignes sont affectées.Android Drawable mute() & setLevel()

J'ai essayé de faire mDrawable.mutate(). SetLevel (progression * 10000/max), mais cela ne fonctionne toujours pas.

public void setProgres(int status, int progress, int max) { 

     Drawable d = getDrawable(status); 

     switch (status) { 
     case RED_INDETERMINATE: 
      setIndeterminateDrawable(d); 
      setIndeterminate(true); 
      break; 
     case YELLOW: 
      d.mutate().setLevel((int) (progress * 10000/max)); 
     case GREEN: 
     case BLUE: 
      setProgressDrawable(d); 
      break; 

     default: 
      throw new IllegalArgumentException(
        "Invalid Status setting for ArtooProgressBar: " + status); 
     } 

     getProgressDrawable().invalidateSelf(); 
     super.invalidate(); 
    } 

    private Drawable getDrawable(int status) { 

     SoftReference<Drawable> ref = sDrawableMaps.get("" + status); 

     if (ref != null && ref.get() != null) 
      return ref.get(); 

     Drawable d; 

     switch (status) { 
     case RED_INDETERMINATE: 
      d = getResources().getDrawable(
        R.drawable.progress_bar_indeterminate); 
      d = tileifyIndeterminate(d); 
      break; 
     case YELLOW: 
      // d = yellow; 
      d = getResources().getDrawable(
        R.drawable.progress_bar_determinate_yellow); 
      break; 
     case GREEN: 
      d = getResources().getDrawable(
        R.drawable.progress_bar_determinate_green); 
      d.setLevel(10000); 
      break; 
     case BLUE: 
      d = getResources().getDrawable(
        R.drawable.progress_bar_determinate_blue); 
      d.setLevel(10000); 
      break; 

     default: 
      throw new IllegalArgumentException(
        "Invalid Status setting for ArtooProgressBar: " + status); 
     } 

     if (d != null) 
      sDrawableMaps.put("" + status, new SoftReference<Drawable>(d)); 

     d.invalidateSelf(); 
     return d; 

    } 

Que manque-t-il?

Merci

+0

Postez votre code! – user432209

+0

Mis à jour avec du code. –

Répondre

2

Il semble que vous partagez la même instance Drawable sur plusieurs points de vue. Fondamentalement, ne faites pas ça. Pourquoi faites-vous ce cache sDrawableMaps au lieu de simplement appeler Resources.getDrawable() pour chaque Drawable dont vous avez besoin? C'est probablement la cause de problèmes.

Aussi votre utilisation de mutate() ne fera pas ce que vous pensez - si le Drawable n'est pas déjà mutable, alors cela retourne une nouvelle instance Drawable que vous modifiez ensuite et que personne ne voit réellement. S'il est déjà mutable, il renvoie la même instance, mais dans ce cas il n'y avait aucune raison d'appeler mute().

+0

J'utilise un cache parce que, vous ne pouvez créer des drawables dans onCreate() je crois et ainsi ils disparaissent quand je fais défiler vers le haut/bas ma liste. Comment faites-vous le mutable drawable - d.mutate() ne fonctionne pas. –

+0

Vous pouvez créer un dessinable quand vous le souhaitez. Honnêtement, débarrassez-vous du cache et appelez simplement Resources.getDrawable() lorsque vous avez besoin d'un drawable. Et vous n'avez pas besoin de "mutate()" pour ce que vous faites - getDrawable() retourne un Drawable qui est assez unique pour vous permettre d'appeler setLevel() etc dessus. muter() est pour quelque chose de différent de ce que vous essayez de faire. Vous vous retrouvez avec le même objet Drawable utilisé par plusieurs éléments d'interface utilisateur. Vous avez juste besoin de réparer ça. – hackbod

+0

Lorsque je les génère à la volée, lorsque je fais défiler la liste vers le haut/bas, tous les fichiers progressDrawables deviennent vides. Toute solution à cela? –