如何在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;
}