странное поведение при выборе и отображении изображений с SD-карты

#android #gridview #gallery #android-contentprovider #android-gridview

#Android #просмотр сетки #Галерея #android-contentprovider #android-просмотр сетки

Вопрос:

Я создал простое приложение для Android, которое отображает изображения в виде сетки, и вы можете выбрать некоторые изображения и отправить их. Это мой метод 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 следующим образом

общедоступный просмотр getView (int position, просмотр convertView, родительская группа ViewGroup)

     {

        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, и проверенное состояние также изменяется (я думаю, случайным образом). the traces.txt показывает, что он поступает из BitmapImage = BitmapFactory.decodeFile(путь к файлу, параметры); строка в методе resizeBitMapImage, который выглядит следующим образом

общедоступное статическое растровое изображение изменяет размер BitmapImage(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 предназначен для ImageAdapter для этого gridview.