2010-03-14 4 views
3

У меня есть вопрос об использовании GalleryView.Галерея Android View Update

Сначала я установил пять «изображений по умолчанию» для показа из каталога с возможностью рисования.

Но после этого, я хочу запустить задачу Async, в которой я загружаю изображения, сохраняю их и покажу их в галерее.

Для этого я создал следующий адаптер:

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; 
    } 
} 

}

и следующую Async Задача

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); 
    } 

Но когда я запустить его у меня есть эта ошибка: Вызванный: android.view.ViewRoot $ CalledFromWrongThreadException: только исходный поток, создавший иерархию представлений, может коснуться его представлений.

Любая идея?

Благодаря

+0

Я не совсем понимаю принятое решение. Можете ли вы изменить и добавить свои изменения для решения проблемы? Это может быть очень полезно для многих людей. Благодарю. – ferguior

ответ

3

Вы должны осуществлять onPostExecute() и перемещать любой код, который взаимодействует с пользовательским интерфейсом (возможно notifyDataSetChange()) к этому методу. Android требует, чтобы взаимодействие с графическим интерфейсом происходило из потока пользовательского интерфейса.

1

Для этого вы должны поместить этот код в onPostExecute (метод) задачи асинхронным:

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(); 
    }