GridView位图图像在刷新时加倍

时间:2015-03-23 02:51:20

标签: android bitmap android-gridview android-sdcard android-memory

我正在关注此Android tutorial以修复我在Bitmap中使用GridView图片时遇到的“内存不足”错误。该教程修复了这个问题,但现在当我点击我的活动中的其他标签时,然后返回我的照片标签,那里的照片,加倍。因此,例如,当我第一次加载标签时,它会从我的SD卡中提取3张照片,并用占位符图像填充其余部分。但是当我浏览其他标签(共4个)时,我回来在我的照片标签GridView中找到6个图像,其余的是占位符。

背景信息:每次我的标签可见时,它会从SD卡加载图片,将其更改为位图,然后我的适配器将这些图片放入{{1}内的每个ImageView }}。在我遇到内存问题之前,它加载得很好,当我浏览其他标签然后回到照片选项卡时没有加倍图像。然而它最终因内存问题而崩溃,所以我不得不解决这个问题。

如何在刷新选项卡时不加载double?谢谢你的帮助。

enter image description here

PhotoTab.java

GridView

GridViewPhotoAdapter

package org.azurespot.cutecollection;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.os.Environment;
import android.support.v4.app.Fragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.GridView;

import org.azurespot.R;

import java.io.File;
import java.util.ArrayList;

/**
 * Created by mizu on 2/8/15.
 */
public class PhotoTab extends Fragment {

    private GridView gridView;
    File[] files;
    ArrayList<PhotoGridItem> photoList = new ArrayList<>();
    ArrayAdapter<PhotoGridItem> adapter;
    Bitmap bitmap;

    public PhotoTab() {
        super();
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        // Inflate the layout for this fragment
        View v = inflater.inflate(R.layout.photo_tab, container, false);

        // with fragments, make sure you include the rootView when finding id
        gridView = (GridView) v.findViewById(R.id.photo_grid);
        adapter = new GridViewPhotoAdapter(getActivity(), R.layout.photo_grid_item);
        // Set the Adapter to GridView
        gridView.setAdapter(adapter);
        adapter.addAll(loadSDCard());

        // add the default icons remaining, to GridView, if less than 24 files on SD card
        for (int i = 0; i < (24 - photoList.size()); i++) {

            adapter.add(new PhotoGridItem(BitmapFactory.decodeResource(getResources(),
                    R.drawable.ic_photo_placeholder)));

        }

        adapter.notifyDataSetChanged();

        return v;
    }

    private ArrayList<PhotoGridItem> loadSDCard() {

        try {
            // gets directory CutePhotos from sd card
            File cutePhotosDir = new File(Environment.getExternalStoragePublicDirectory
                    (Environment.DIRECTORY_PICTURES), "CutePhotos");
            // lists all files in CutePhotos, loads in Files[] array
            files = cutePhotosDir.listFiles();

            for (File singleFile : files) {
                String filePath = singleFile.getAbsolutePath();

                bitmap = decodeSampledBitmap(filePath, 270, 270);

                photoList.add(new PhotoGridItem(bitmap));
            }

        } catch (Exception e) {
            e.printStackTrace();
        }

        return photoList;
    }

    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 static Bitmap decodeSampledBitmap(String path, int reqWidth, int reqHeight) {

        // First decode with inJustDecodeBounds=true to check dimensions
        final BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;
        BitmapFactory.decodeFile(path, options);

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

        // Decode bitmap with inSampleSize set
        options.inJustDecodeBounds = false;

        return BitmapFactory.decodeFile(path, options);
    }
}

1 个答案:

答案 0 :(得分:0)

试试这个:

adap = null;
if (adap == null) {

                            adap = new Grid_View_Adatper(activity, arrayList);
                            gridView.setAdapter(adap);

                        }
                        adap.notifyDataSetChanged();