Как сохранить уже загруженные изображения в Gridview после прокрутки в Android
У меня есть GridView
который показывает изображения с SDCard. я использую AsyncTask
в getview()
метод (getview загружает растровое изображение в AsyncTask) из этого урока.
GridView
прокрутка быстрая и загружает изображения в Gridview
быстро и правильно позиционирует, но моя проблема:
Когда я прокручиваю GridView, items that are not visible on the screen can not be held
,
И если вернуться к предыдущей позиции, элементы загружаются снова с getview()
метод.
С вышеупомянутым учебником, когда я прокручиваю GridView
все позиции изображений изменились.
Я изменился getview()
(if_else
который показывает с комментарием в моем коде) и разрешил его, но он не сохраняет предыдущее изображение и при быстрой прокрутке GridView
сначала изображение по умолчанию (ic_launcher
), и через некоторое время загружается правильное изображение. Как решить эту проблему? (удерживайте все изображения в GridView
без уменьшения скорости прокрутки)
@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;
}