Android Gallery View Update Images
-
19-09-2019 - |
Frage
Ich habe eine Frage zur Verwendung von GalerieView.
Zunächst habe ich fünf "Standardbilder" gesetzt, um aus dem zeichnischen Verzeichnis zu zeigen.
Aber danach möchte ich eine asynchronisierte Aufgabe ausführen, in der ich die Bilder herunterlade, speichere und in der Galerie zeige.
Dafür habe ich den folgenden Adapter erstellt:
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;
}
}
}
und die folgende asynchronisierte Aufgabe
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);
}
Aber wenn ich es ausführe, habe ich diesen Fehler: verursacht von: android.view.viewroot $ Calling FromwrongThreadException: Nur der ursprüngliche Thread, der eine Ansichtshierarchie erstellt hat, kann seine Ansichten berühren.
Irgendeine Idee?
Vielen Dank
Lösung
Sie sollten implementieren onPostExecute()
und verschieben Sie jeden Code, der mit der Benutzeroberfläche interagiert (vielleicht notifyDataSetChange()
) zu dieser Methode. Android erfordert, dass die Interaktion mit der GUI aus dem UI -Thread erfolgt.
Andere Tipps
Dafür müssen Sie diesen Code in die OnPostExecute () -Methode der asynchronen Aufgabe einsetzen:
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();
}