Android 图像重画所有图像

Android 图像重画所有图像,android,gridview,Android,Gridview,我尝试创建一个带有网格视图的图库,现在我有一个列表,可以以一种简单的方式加载图像,非常平滑,但问题是每次单元格被重绘时,图像也被重绘,我使用缓存,但什么都没有,这是我的代码: public class GalleryFragment extends Fragment { View view; GridView gridview; ImageAdapter myImageAdapter; Bitmap mPlaceHolderBitmap; Arr

我尝试创建一个带有网格视图的图库,现在我有一个列表,可以以一种简单的方式加载图像,非常平滑,但问题是每次单元格被重绘时,图像也被重绘,我使用缓存,但什么都没有,这是我的代码:

public class GalleryFragment extends Fragment {

    View view;

    GridView gridview;

    ImageAdapter myImageAdapter;

    Bitmap mPlaceHolderBitmap;

    ArrayList<String> arrayPhotos = new ArrayList<String>();  

    private LruCache<String, Bitmap> mMemoryCache;

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

        view = inflater.inflate(R.layout.gallery_layout, container, false);

        return view;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        ActivityManager am = (ActivityManager) getActivity().getSystemService(Context.ACTIVITY_SERVICE);

        int memClass = am.getMemoryClass();

        final int cacheSize = 1024 * 1024 * memClass / 8;

        mMemoryCache = new LruCache<String, Bitmap>(cacheSize) {

            protected int sizeOf(String key, Bitmap bitmap) {
                // The cache size will be measured in bytes rather than number
                // of items.
                return bitmap.getByteCount();
            }

        };
    }

    @Override
    public void onStart (){

        super.onStart();

        gridview = (GridView) view.findViewById(R.id.gridView);
        gridview.setAdapter(new ImageAdapter(getActivity()));

        String ExternalStorageDirectoryPath = Environment.getExternalStorageDirectory().getAbsolutePath();
        String targetPath = ExternalStorageDirectoryPath + "/test/";

        File targetDirector = new File(targetPath);

        File[] files = targetDirector.listFiles();
        for (File file : files){
            arrayPhotos.add(file.getAbsolutePath());
        } 

     }


     public void addBitmapToMemoryCache(String key, Bitmap bitmap) {
            if (getBitmapFromMemCache(key) == null) {
                mMemoryCache.put(key, bitmap);
            }
        }

        public Bitmap getBitmapFromMemCache(String key) {
            return (Bitmap) mMemoryCache.get(key);
        }




    public class ImageAdapter extends BaseAdapter {

        private Context mContext;

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

        public int getCount() {
            return arrayPhotos.size();
        }

        public Object getItem(int position) {
            return null;
        }

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

        // create a new ImageView for each item referenced by the Adapter
        public View getView(int position, View convertView, ViewGroup parent) {

            ImageView imageView;

            if (convertView == null) {  

                imageView = new ImageView(mContext);
                imageView.setLayoutParams(new GridView.LayoutParams(300, 300));
                imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
                imageView.setPadding(8, 8, 8, 8);

            } else {
                imageView = (ImageView) convertView;
            }

                        String imageKey = arrayPhotos.get(position);
        Bitmap bm = getBitmapFromMemCache(imageKey);

        if (bm == null){
            loadBitmap(imageKey, i);
        }
        else {
            i.setImageBitmap(bm);   
        }


            return imageView;
        }

    }

    static class AsyncDrawable extends BitmapDrawable {

        private final WeakReference<BitmapWorkerTask> bitmapWorkerTaskReference;

        public AsyncDrawable(Resources res, Bitmap bitmap, BitmapWorkerTask bitmapWorkerTask) {

            super(res, bitmap);

            bitmapWorkerTaskReference = new WeakReference<BitmapWorkerTask>(bitmapWorkerTask);
        }

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

    }


    public void loadBitmap(String resId, ImageView imageView) {

        if (cancelPotentialWork(resId, imageView)) {

            final BitmapWorkerTask task = new BitmapWorkerTask(imageView);

            final AsyncDrawable asyncDrawable = new AsyncDrawable(getResources(), mPlaceHolderBitmap, task);

            imageView.setImageDrawable(asyncDrawable);

            task.execute(resId);
        }
    }

    public static boolean cancelPotentialWork(String data, ImageView imageView) {

        final BitmapWorkerTask bitmapWorkerTask = getBitmapWorkerTask(imageView);

        if (bitmapWorkerTask != null) {

            final String bitmapData = bitmapWorkerTask.path;

            // If bitmapData is not yet set or it differs from the new data
            if (bitmapData == "" || bitmapData != data) {
                // Cancel previous task
                bitmapWorkerTask.cancel(true);
            } 
            else {
                // The same work is already in progress
                return false;
            }
        }
        // No task associated with the ImageView, or an existing task was cancelled
        return true;
    }


    private static BitmapWorkerTask getBitmapWorkerTask(ImageView imageView) {

        if (imageView != null) {

            final Drawable drawable = imageView.getDrawable();
            if (drawable instanceof AsyncDrawable) {

                final AsyncDrawable asyncDrawable = (AsyncDrawable) drawable;
                return asyncDrawable.getBitmapWorkerTask();
            }
        }
        return null;
    }



    class BitmapWorkerTask extends AsyncTask<String, Void, Bitmap> {

        private final WeakReference<ImageView> imageViewReference;
        private String path;

        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) {

            path = params[0];

            Bitmap bitmap = decodeSampledBitmapFromResource(path, 300, 300);

            addBitmapToMemoryCache(String.valueOf(params[0]), bitmap);


            return bitmap;
        }

        // 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 = getBitmapWorkerTask(imageView);

                if (this == bitmapWorkerTask && imageView != null) {
                    imageView.setImageBitmap(bitmap);
                }
            }
        }
    }

    public static Bitmap decodeSampledBitmapFromResource(String filePath,int reqWidth, int reqHeight) {

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

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

        // Decode bitmap with inSampleSize set
        options.inJustDecodeBounds = false;
        return BitmapFactory.decodeFile(filePath, options);
    }

    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;
    }

}

哪里出错了?

我看不出您在哪里检查内存缓存以重新使用位图。我所能看到的就是它的储藏室。除非这是在代码中没有共享。我编辑问题,现在我把检查缓存,但也与此检查的图像是重画!