6

Android3.1タブレットアプリケーションを開発しようとしています。

このアプリにはたくさんの画像があり、UIスレッドからビットマップを処理するチュートリアルに従いましたが、次の理由で何か間違ったことをしました。

java.lang.ClassCastException:android.widget.AbsListView$LayoutParamsをandroid.widget.Gallery$LayoutParamsにキャストできません

これは私のコードです:

アクティビティにギャラリーを設定しました

mFactGallery = (Gallery)mView.findViewById(R.id.factGallery);
mFactGallery.setAdapter(new ImageGalleryAdapter(mActivity, ImageView.ScaleType.FIT_END, 180, 90));

ImageGalleryAdapter.java

public class ImageGalleryAdapter extends BaseAdapter
{
    private ArrayList<String> mImagesPath;
    private Context mContext;
    private int mWidth;
    private int mHeight;

    public ArrayList<String> getmImagesPath()
    {
        return mImagesPath;
    }

    public void setmImagesPath(ArrayList<String> mImagesPath)
    {
        this.mImagesPath = mImagesPath;
    }

    public void addImage(String imagePath)
    {
        mImagesPath.add(imagePath);
    }

    public ImageGalleryAdapter(Context context, ImageView.ScaleType scaleType, int width, int height)
    {
        mContext = context;
        mWidth = width;
        mHeight = height;
        mScaleType = scaleType;

        mImagesPath = new ArrayList<String>();
    }

    @Override
    public int getCount()
    {
        return mImagesPath.size();
    }

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

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

    @Override
    public View getView(int position, View convertView, ViewGroup parent)
    {
        // Get a View to display image data                     
        ImageView imageView;
        // if it's not recycled, initialize some attributes
        if (convertView == null)
        {
            imageView = new ImageView(mContext);
            imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
            imageView.setLayoutParams(new GridView.LayoutParams(
                    LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
        }
        else
        {
            imageView = (ImageView) convertView;
            // Recicla el Bitmap.
            Bitmap bm = ((BitmapDrawable) imageView.getDrawable()).getBitmap();
            if (bm != null)
                bm.recycle();
        }

        String filePath = mImagesPath.get(position);
        if (BitmapTools.cancelPotentialWork(filePath, imageView))
        {
            String[] params = {filePath, Integer.toString(mWidth), Integer.toString(mHeight)};
            final BitmapWorkerTask task = new BitmapWorkerTask(imageView);
            final AsyncDrawable asyncDrawable =
                    new AsyncDrawable(mContext.getResources(), filePath, task);
            imageView.setImageDrawable(asyncDrawable);
            task.execute(params);
        }

        return imageView;
    }
}

BitmapWorkerTask.java

public class BitmapWorkerTask extends AsyncTask<String, Void, Bitmap>
{
    private final WeakReference<ImageView> imageViewReference;
    public String imgPath = "";

    public BitmapWorkerTask(ImageView imageView) {
        // Use a WeakReference to ensure the ImageView can be garbage collected
        imageViewReference = new WeakReference<ImageView>(imageView);
    }

    // Decode image in background.
    @Override
    protected Bitmap doInBackground(String... params)
    {
        imgPath = params[0];
        int width = Integer.valueOf(params[1]).intValue();
        int height = Integer.valueOf(params[2]).intValue();
        return BitmapTools.decodeSampledBitmapFromDisk(imgPath, width, height);
    }

    // Once complete, see if ImageView is still around and set bitmap.
    @Override
    protected void onPostExecute(Bitmap bitmap)
    {
        if (isCancelled())
        {
            bitmap = null;
        }

        if (imageViewReference != null && bitmap != null)
        {
            final ImageView imageView = imageViewReference.get();
            final BitmapWorkerTask bitmapWorkerTask =
                    BitmapTools.getBitmapWorkerTask(imageView);
            if (this == bitmapWorkerTask && imageView != null)
            {
                imageView.setImageBitmap(bitmap);
            }
        }
    }
}

AsyncDrawable.java

public class AsyncDrawable extends BitmapDrawable
{
    private final WeakReference<BitmapWorkerTask> bitmapWorkerTaskReference;

    public AsyncDrawable(Resources res, String filepath,
            BitmapWorkerTask bitmapWorkerTask)
    {
        super(res, filepath);
        bitmapWorkerTaskReference =
            new WeakReference<BitmapWorkerTask>(bitmapWorkerTask);
    }

    public BitmapWorkerTask getBitmapWorkerTask()
    {
        return bitmapWorkerTaskReference.get();
    }
}

私は何が間違っているのですか?

4

2 に答える 2

9

次のように置き換えGridView.LayoutParamsGallery.LayoutParamsください、それはあなたの問題を解決します

imageView.setLayoutParams(new Gallery.LayoutParams(
                    LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
于 2012-10-24T07:12:47.320 に答える
5

ImageGalleryAdapter.javaでは、これは間違っています。

imageView.setLayoutParams(new GridView.LayoutParams(
                    LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));

正しいLayoutParamsクラスを使用してください。

imageView.setLayoutParams(new Gallery.LayoutParams(
                    LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));

(LayoutParamsのスーパークラスはではGalleryなくGridView

于 2012-10-24T07:09:20.577 に答える