2010-03-14 6 views
3

J'ai une question à propos de l'utilisation de GalleryView.Galerie Android Afficher les images mises à jour

Dans un premier temps, j'ai défini cinq "images par défaut" à afficher à partir du répertoire pouvant être tracé. Mais après, je veux exécuter une tâche asynchrone dans laquelle je télécharge les images, les enregistre et les montre dans la galerie.

Pour que je créé l'adaptateur suivant:

public class ImageAdapter extends BaseAdapter { 
    int mGalleryItemBackground; 
    private Context mContext; 

    private ArrayList<Integer> mImageIds = new ArrayList<Integer>(); 
    private ArrayList<Drawable> mImageDrawables = new ArrayList<Drawable>(); 

    public ImageAdapter(Context c) { 
     mContext = c; 
     TypedArray a = obtainStyledAttributes(R.styleable.Gallery1); 
     mGalleryItemBackground = a.getResourceId(
       R.styleable.Gallery1_android_galleryItemBackground, 0); 
     a.recycle(); 
    } 

    public void setPlaces(int count) { 
     for (int i = 0; i < count; i++) { 
      mImageIds.add(R.drawable.tournoimg); 
      mImageDrawables.add(null); 
     } 
    } 

    public void setDrawable(String resource, int position) { 
     Drawable image = Drawable.createFromPath(resource); 
     mImageDrawables.add(position, image); 
    } 

    public int getCount() { 
     return mImageIds.size(); 
    } 

    public Object getItem(int position) { 
     return position; 
    } 

    public long getItemId(int position) { 
     return position; 
    } 

    public View getView(int position, View convertView, ViewGroup parent) { 
     ImageView i = new ImageView(mContext); 
     if (mImageDrawables.get(position) == null) 
      i.setImageResource(mImageIds.get(position)); 
     else 
      i.setImageDrawable(mImageDrawables.get(position)); 
     i.setLayoutParams(new Gallery.LayoutParams(60, 78)); 
     i.setScaleType(ImageView.ScaleType.FIT_XY); 
     i.setBackgroundResource(mGalleryItemBackground); 
     return i; 
    } 
} 

}

et les éléments suivants Async Tâche

private class FillImages extends AsyncTask<ArrayList<Place>, Void, Void> { 

    protected Void doInBackground(ArrayList<Place>... listplaces) { 
     ArrayList<Place> places = listplaces[0]; 
     Iterator<Place> it = places.iterator(); 
     int position = 0; 
     while (it.hasNext()) { 
      Place p = it.next(); 
      saveImage(p.getImage(), p.getURLImage()); 
      // Gallery g = (Gallery) findViewById(R.id.gallery); 
      mImageAdapter.setDrawable(p.getImage(), position); 
      position++; 
      mImageAdapter.notifyDataSetChanged(); 
     } 
     return (null); 
    } 

Mais quand je le lance i cette erreur: Causée par: android.view.ViewRoot $ CalledFromWrongThreadException: Seul le thread d'origine qui a créé une hiérarchie de vues peut toucher ses vues.

Une idée?

Merci

+0

Je ne comprends pas tout à fait la solution retenue. Pouvez-vous modifier et ajouter vos modifications pour résoudre le problème? Cela peut être très utile pour beaucoup de gens. Merci. – ferguior

Répondre

3

Vous devez implémenter onPostExecute() et déplacer tout code qui interagit avec l'interface utilisateur (peut-être notifyDataSetChange()) à cette méthode. Android nécessite que l'interaction avec l'interface graphique provienne du thread d'interface utilisateur.

1

Pour que vous devez mettre ce code dans la méthode onPostExecute() de la tâche Async:

ArrayList<Place> places = listplaces[0]; 
    Iterator<Place> it = places.iterator(); 
    int position = 0; 
    while (it.hasNext()) { 
     Place p = it.next(); 
     saveImage(p.getImage(), p.getURLImage()); 
     // Gallery g = (Gallery) findViewById(R.id.gallery); 
     mImageAdapter.setDrawable(p.getImage(), position); 
     position++; 
     mImageAdapter.notifyDataSetChanged(); 
    } 
Questions connexes