سؤال

لدي سؤال حول استخدام GalleryView.

في البداية، قمت بتعيين خمسة "صور افتراضية" لإظهارها من الدليل القابل للشرح.

ولكن بعد ذلك، أريد تشغيل مهمة 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.viewro.viewroot $ يتم استدعاء $ fromwrongthradexception: فقط الخيط الأصلي الذي أنشأ التسلسل الهرمي الرؤية يمكن أن يلمس وجهات نظره.

اي فكرة؟

شكرا

هل كانت مفيدة؟

المحلول

يجب أن تنفذ onPostExecute() ونقل أي رمز يتفاعل مع واجهة المستخدم (ربما notifyDataSetChange()) إلى هذه الطريقة. يتطلب Android أن التفاعل مع GUI يحدث من مؤشر ترابط UI.

نصائح أخرى

لأنه يجب عليك وضع هذا الرمز في OnPostExecute () طريقة مهمة 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();
    }
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top