0

画像を GridView list に表示するための配列を作成しました。問題は、大量のメモリを消費していること、スクロールが遅く(スムーズではない)、毎回強制的に閉じ続けることです。ソリューションを確認した後、それらをストレージに保存してからアプリで使用する必要があることがわかりました。しかし、うまくいきませんでした。誰かが私にそれを行う方法を手伝ってもらえますか?

これは私のアダプターコードです:

public class ImageAdapter extends BaseAdapter {
Context mContext;
// Keep all Images in array
public Integer[] mThumbIds = { R.drawable.d, R.drawable.t,
        R.drawable.e, R.drawable.e, R.drawable.r,
        R.drawable.asdt, R.drawable.asd, R.drawable.a,
        //... etc

};

public static int calculateInSampleSize(BitmapFactory.Options options,
        int reqWidth, int reqHeight) {
    // Raw height and width of image
    final int height = options.outHeight;
    final int width = options.outWidth;
    int inSampleSize = 1;

    if (height > reqHeight || width > reqWidth) {

        final int halfHeight = height / 2;
        final int halfWidth = width / 2;

        // Calculate the largest inSampleSize value that is a power of 2 and
        // keeps both
        // height and width larger than the requested height and width.
        while ((halfHeight / inSampleSize) > reqHeight
                && (halfWidth / inSampleSize) > reqWidth) {
            inSampleSize *= 2;
        }
    }

    return inSampleSize;
}

public Bitmap decodeSampledBitmapFromResource(Resources res, int resId,
        int reqWidth, int reqHeight) {

    // First decode with inJustDecodeBounds=true to check dimensions

    final BitmapFactory.Options options = new BitmapFactory.Options();
    options.inSampleSize=4;
    options.inJustDecodeBounds = true;
    BitmapFactory.decodeResource(res, resId, options);

    // Calculate inSampleSize
    options.inSampleSize = calculateInSampleSize(options, reqWidth,
            reqHeight);

    // Decode bitmap with inSampleSize set
    options.inJustDecodeBounds = false;
    return BitmapFactory.decodeResource(res, resId, options);
}

// Constructor
public ImageAdapter(Context c) {
    mContext = c;
}

@Override
public int getCount() {
    return mThumbIds.length;
}

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

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

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    ImageView imageView;
    imageView = new ImageView(mContext);

    imageView.setImageBitmap(decodeSampledBitmapFromResource(
            imageView.getResources(), mThumbIds[position], 100, 100));
    imageView.buildDrawingCache(isEmpty());
    imageView.setScaleType(ImageView.ScaleType.FIT_CENTER);
    imageView.setLayoutParams(new GridView.LayoutParams(
            (getScreenWidth() / 3), (getScreenWidth() / 3)));
    return imageView;

}

@SuppressWarnings("deprecation")
@SuppressLint("NewApi")
public int getScreenWidth() {
    int columnWidth;
    WindowManager wm = (WindowManager) mContext
            .getSystemService(Context.WINDOW_SERVICE);
    Display display = wm.getDefaultDisplay();

    final Point point = new Point();
    try {
        display.getSize(point);
    } catch (java.lang.NoSuchMethodError ignore) { // Older device
        point.x = display.getWidth();
        point.y = display.getHeight();
    }
    columnWidth = point.x;
    return columnWidth;
}

}

4

1 に答える 1

0

私はただ Picasso を使っていて、すべての作業はPicassoに任せています。

Picasso.with(context).load(R.drawable.whatever).into(imageView);

そして完了。

于 2013-11-02T19:37:18.057 に答える