3

我制作了一个简单的 android 应用程序,它在 gridview中显示图像,您可以选择一些图像并发送它们。这是我的 getView 方法。

  public View getView(int position, View convertView, ViewGroup parent)
    {
        View v;
        if (convertView == null)
        {
            LayoutInflater li = getLayoutInflater();
            v = li.inflate(R.layout.imageview, null);
            final CheckBox cb = (CheckBox) v.findViewById(R.id.checkbox);
            cb.setOnCheckedChangeListener(new AddPhotos());

            ImageView iv = (ImageView) v.findViewById(R.id.image);

            //make image clickable so that it is checked when clicked on the image
            iv.setOnClickListener(new OnClickListener()
            {

                @Override
                public void onClick(View v)
                {
                    cb.setChecked((cb.isChecked() ? false : true));

                }
            });

            imagecursor.moveToPosition(position);

            uriList.add(imagecursor.getString(image_column_index));

            File image = new File(imagecursor.getString(image_column_index));

            Bitmap actualBitmap = resizeBitMapImage(image.getPath(), image_width, image_height);
            iv.setImageBitmap(actualBitmap);

            iv.setLayoutParams(new FrameLayout.LayoutParams(95, 95));
            System.gc();

        }
        else
        {
            v = convertView;
            System.gc();

        }
        return v;
    }
}

现在的问题是,对于较少的图像,即当所有图像都显示而无需滚动时,它工作正常。但是,如果有图像不可见并且您必须向下滚动,那么当您向下或向上滚动时,它会重复早期的图像并更改图像的选中状态,从而显示出一种奇怪的行为。我改变了getView方法

public View getView(int position, View convertView, ViewGroup parent)

    {

        View v;
        if (convertView == null)
        {
            LayoutInflater li = getLayoutInflater();
            v = li.inflate(R.layout.imageview, null);

        }
        else
        {
            v = convertView;
            System.gc();

        }

        final CheckBox cb = (CheckBox) v.findViewById(R.id.checkbox);
        cb.setOnCheckedChangeListener(new AddPhotos());

        ImageView iv = (ImageView) v.findViewById(R.id.image);

        // make image clickable so that it is checked when clicked on the image
        iv.setOnClickListener(new OnClickListener()
        {

            @Override
            public void onClick(View v)
            {
                cb.setChecked((cb.isChecked() ? false : true));

            }
        });

        imagecursor.moveToPosition(position);

        uriList.add(imagecursor.getString(image_column_index));

        File image = new File(imagecursor.getString(image_column_index));

        Bitmap actualBitmap = resizeBitMapImage(image.getPath(), image_width, image_height);
        iv.setImageBitmap(actualBitmap);

        iv.setLayoutParams(new FrameLayout.LayoutParams(95, 95));
        System.gc();

        return v;
    }
}

现在图像的顺序没有改变,但向上或向下滚动会引发 ANR,并且检查状态也发生了变化(我猜是随机的)。traces.txt 显示它来自bitMapImage = BitmapFactory.decodeFile(filePath, options); resizeBitMapImage 方法中的行如下

公共静态位图 resizeBitMapImage(String filePath, int targetWidth, int targetHeight)

{
    Bitmap bitMapImage = null;
    // First, get the dimensions of the image
    Options options = new Options();
    options.inJustDecodeBounds = true;
    BitmapFactory.decodeFile(filePath, options);
    double sampleSize = 0;
    // Only scale if we need to
    // (16384 buffer for img processing)
    Boolean scaleByHeight = Math.abs(options.outHeight - targetHeight) >= Math.abs(options.outWidth - targetWidth);

    if (options.outHeight * options.outWidth * 2 >= 1638)
    {
        // Load, scaling to smallest power of 2 that'll get it <= desired
        // dimensions
        sampleSize = scaleByHeight ? options.outHeight / targetHeight : options.outWidth / targetWidth;
        sampleSize = (int) Math.pow(2d, Math.floor(Math.log(sampleSize) / Math.log(2d)));
    }

    // Do the actual decoding
    options.inJustDecodeBounds = false;
    options.inTempStorage = new byte[128];
    while (true)
    {
        try
        {
            options.inSampleSize = (int) sampleSize;
            bitMapImage = BitmapFactory.decodeFile(filePath, options);

            break;
        }
        catch (Exception ex)
        {
            try
            {
                sampleSize = sampleSize * 2;
            }
            catch (Exception ex1)
            {

            }
        }
    }

    return bitMapImage;
}

现在我对android开发很陌生,很困惑。请任何帮助将不胜感激

编辑:图像被添加到 gridview 并且 getView 方法适用于这个 gridview 的 imageAdapter。

4

0 回答 0