如何在Android中滚动后将已加载的图像保留在Gridview中

如何在Android中滚动后将已加载的图像保留在Gridview中,android,android-gridview,getview,android-scroll,Android,Android Gridview,Getview,Android Scroll,我有一个GridView,显示SD卡上的图像。我在中的getview()方法中使用AsyncTask(getview在AsyncTask中加载位图) GridView滚动速度很快,可以在GridView中快速加载图像并正确定位,但我的问题是: 当我滚动GridView时,屏幕上不可见的项目无法保持 如果返回到前一个位置,则使用getview()方法再次加载项目 在上面的教程中,当我滚动GridView时,所有图像的位置都已更改 我更改了getview()(if_else,在我的代码中显示注释)并

我有一个
GridView
,显示SD卡上的图像。我在中的
getview()
方法中使用
AsyncTask
(getview在AsyncTask中加载位图)

GridView
滚动速度很快,可以在
GridView
中快速加载图像并正确定位,但我的问题是:

当我滚动GridView时,
屏幕上不可见的项目无法保持

如果返回到前一个位置,则使用
getview()
方法再次加载项目

在上面的教程中,当我滚动
GridView
时,所有图像的位置都已更改

我更改了
getview()
if_else
,在我的代码中显示注释)并解决了它,但它不保存上一个图像,当快速滚动
GridView
时,首先显示默认图像(
ic_launcher
),过一段时间后,加载正确的图像。 如何解决这个问题?(在
GridView
中保留所有图像,但不降低滚动速度)

@覆盖
公共视图getView(最终整数位置、视图视图、视图组父视图){
最终持票人;
//如果(视图==null){
holder=新的ViewHolder();
视图=充气机。充气(R.layout.showitems,父项,false);
holder.myimage=(ImageView)view.findViewById(R.id.imagess);
holder.myimage.setScaleType(ImageView.ScaleType.CENTER\U裁剪);
holder.myimage.setPadding(8,8,8,8);
视图.设置标签(支架);
//      } 
/*否则{
holder=(ViewHolder)view.getTag();
}*/
新建异步任务(){
私人持票人v;
@凌驾
受保护的位图背景(ViewHolder…参数){
v=参数[0];
位图bm=decodeSampledBitmapFromUri(mylist.get(position).getmypath(),220,220);
返回bm;
}
@凌驾
受保护的void onPostExecute(位图结果){
super.onPostExecute(结果);
v、 设置图像位图(结果);
}
}
.执行(持有人);
view.setOnClickListener(新的OnClickListener(){
@凌驾
公共void onClick(视图v){
字符串this_id=mylist.get(position.getmyid();
字符串this_path=mylist.get(position.getmypath();
Intent ss=新Intent(mContext,show.class);
ss.putExtra(“id”,即该id);
mContext.startActivity(ss);
}
});
返回视图;
}
公共位图解码SampleDbitMapFromUri(字符串路径、int-reqWidth、int-reqHeight){
位图bm=null;
//使用INJUSTDECBOUNDS首次解码=true检查尺寸
final BitmapFactory.Options=new BitmapFactory.Options();
options.inJustDecodeBounds=true;
解码文件(路径、选项);
//计算样本大小
options.inSampleSize=计算样本大小(options、reqWidth、reqHeight);
//使用inSampleSize集合解码位图
options.inJustDecodeBounds=false;
bm=BitmapFactory.decodeFile(路径、选项);
返回bm;
}
公共位图解码SampleDbitMapFromUri_VID(字符串路径、int-reqWidth、int-reqHeight){
位图bm=null;
//使用INJUSTDECBOUNDS首次解码=true检查尺寸
final BitmapFactory.Options=new BitmapFactory.Options();
options.inJustDecodeBounds=true;
ThumbnailUtils.createVideoThumbnail(路径,MediaStore.Video.Thumbnails.MINI_-KIND);
//计算样本大小
options.inSampleSize=计算样本大小(options、reqWidth、reqHeight);
//使用inSampleSize集合解码位图
options.inJustDecodeBounds=false;
bm=ThumbnailUtils.createVideoThumbnail(路径,MediaStore.Video.Thumbnails.MINI_-KIND);
返回bm;
}
公共整数计算示例大小(
BitmapFactory.Options选项、int reqWidth、int reqHeight){
//图像的原始高度和宽度
最终内部高度=options.outHeight;
最终整数宽度=options.outWidth;
int inSampleSize=1;
如果(高度>要求高度| |宽度>要求宽度){
如果(宽度>高度){
inSampleSize=数学圆((浮动)高度/(浮动)要求高度);
} 
否则{
inSampleSize=数学圆((浮动)宽度/(浮动)宽度);
}
}
返回样本大小;
}

这就是为什么GridView很有用的原因。如果它保留视图,您将消耗所有RAM并收到crash@AntonMalyshev gallery android操作系统如何解决这个问题(所有图像保存和滚动都很快)这是真的还是我错了?也许他们使用了一些cachingIt,这就是GridView有用的原因。如果它保留视图,您将消耗所有RAM并收到crash@AntonMalyshev gallery android操作系统如何解决这个问题(所有图像保存和滚动都很快)这是真的还是我错了?也许他们使用了某种缓存
    @Override
    public View getView( final int position, View view, ViewGroup parent) {

        final ViewHolder holder;
        //if (view == null) {
            holder = new ViewHolder();

            view = inflater.inflate(R.layout.showitems,parent, false);

            holder.myimage=(ImageView) view.findViewById(R.id.imagess);
            holder.myimage.setScaleType(ImageView.ScaleType.CENTER_CROP);
            holder.myimage.setPadding(8, 8, 8, 8);


            view.setTag(holder);
    //      } 

    /*  else {

            holder = (ViewHolder) view.getTag();
            }*/

        new AsyncTask<ViewHolder, Void, Bitmap>() {


                    private ViewHolder v;

                    @Override
                    protected Bitmap doInBackground(ViewHolder... params) {
                        v = params[0];

                        Bitmap bm = decodeSampledBitmapFromUri(mylist.get(position).getmypath(), 220, 220);
                        return bm;

                    }

                    @Override
                    protected void onPostExecute(Bitmap result) {
                        super.onPostExecute(result);

                        v.myimage.setImageBitmap(result);
    }

                }

                .execute(holder);


            view.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {

                    String this_id= mylist.get(position).getmyid();
                    String this_path=mylist.get(position).getmypath();

                    Intent ss=new Intent(mContext,show.class);
                    ss.putExtra("id", this_id);
                    mContext.startActivity(ss);

                }
            });

        return view;


}


    public Bitmap decodeSampledBitmapFromUri(String path, int reqWidth,int reqHeight) {

        Bitmap bm = null;

        // 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;
        bm = BitmapFactory.decodeFile(path, options);



        return bm;

    }




    public Bitmap decodeSampledBitmapFromUri_VID(String path, int reqWidth,int reqHeight) {

        Bitmap bm = null;

        // First decode with inJustDecodeBounds=true to check dimensions
        final BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;
        ThumbnailUtils.createVideoThumbnail(path, MediaStore.Video.Thumbnails.MINI_KIND);

        // Calculate inSampleSize

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

        // Decode bitmap with inSampleSize set
        options.inJustDecodeBounds = false;
        bm = ThumbnailUtils.createVideoThumbnail(path, MediaStore.Video.Thumbnails.MINI_KIND);



        return bm;

    }

    public 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) {
            if (width > height) {
                inSampleSize = Math.round((float) height/ (float) reqHeight);


            } 

            else {

                inSampleSize = Math.round((float) width / (float) reqWidth);

            }

        }


        return inSampleSize;

    }