Android 将图像动态添加到gridview会导致内存不足错误
我正在尝试将图像添加到栅格视图中。栅格视图如下所示:Android 将图像动态添加到gridview会导致内存不足错误,android,gridview,Android,Gridview,我正在尝试将图像添加到栅格视图中。栅格视图如下所示: import android.app.Activity; import android.app.AlertDialog; import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.graphics.drawable.Drawable; import android.n
import android.app.Activity;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import java.io.File;
import java.util.ArrayList;
/**
* Created by Khan on 29/05/2016.
*/
public class GridViewAdapter extends BaseAdapter {
private Context context;
ArrayList<String> imageTitles = new ArrayList<String>();
ArrayList<Drawable> images = new ArrayList<Drawable>();
ArrayList<File> files = new ArrayList<File>();
public GridViewAdapter(Context context, ArrayList<Drawable> images, ArrayList<String> imageTitles,ArrayList<File> files) {
this.images = images;
this.context = context;
this.imageTitles = imageTitles;
this.files = files;
}
@Override
public int getCount() {
return imageTitles.size();
}
@Override
public Object getItem(int position) {
return position;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
View row = convertView;
ViewHolder holder = null;
LayoutInflater inflater = ((Activity) context).getLayoutInflater();
row = inflater.inflate(R.layout.grid_item_layout, parent, false);
holder = new ViewHolder();
holder.imageTitle = (TextView) row.findViewById(R.id.text);
holder.image = (ImageView) row.findViewById(R.id.image);
holder.imageButton = (ImageButton)row.findViewById(R.id.deleteImageButton);
holder.imageTitle.setText(imageTitles.get(position));
holder.image.setImageDrawable(images.get(position));
holder.imageButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try
{
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setMessage("Are you sure to delete image " + imageTitles.get(position) + "?")
.setCancelable(false)
.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
if (files.get(position).delete()) {
Toast.makeText(context, "The image is deleted successfully.", Toast.LENGTH_LONG).show();
images.remove(position);
files.remove(position);
imageTitles.remove(position);
notifyDataSetChanged();
}
}
})
.setNegativeButton("No", new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
dialog.cancel();
}
});
AlertDialog alert = builder.create();
alert.show();
}
catch (Exception e)
{
e.printStackTrace();
// Log.d("DELETE","Something went wrong");
}
}
});
// what happens when user clicks on one of the images
holder.image.setOnClickListener(new
View.OnClickListener() {
@Override
public void onClick(View v)
{
try {
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.parse("file://" +files.get(position).toString()), "image/*");
context.startActivity(intent);
// context.startActivity(new Intent(Intent.ACTION_VIEW, )); /** replace with your own uri */
}
catch (Exception e)
{
e.printStackTrace();
// Log.d("GridView Adpater","The file path is" + files.get(position).toString());
}
}
});
return row;
}
static class ViewHolder {
TextView imageTitle;
ImageView image;
ImageButton imageButton;
}
}
上述代码的问题是,在运行时,向图像添加大量图像会导致运行时内存不足错误
images.add(BitmapDrawable.createFromPath(file.getAbsolutePath()));
因此,为了避免上述问题,我需要逐个向gridview添加图像。我怎样才能做到这一点?请帮我解决这个问题 您不应将图像作为可绘制内容传递给适配器。相反,您可以使用传递的文件来加载图像。您需要使用图像加载程序,例如或,以避免OutOfMemory异常或延迟滚动
使用毕加索的示例:
Picasso.with(context).load(files.get(position)).into(holder.image);
而不是:
holder.image.setImageDrawable(images.get(position));
您不应该将图像作为可绘制内容传递给适配器。相反,您可以使用传递的文件来加载图像。您需要使用图像加载程序,例如或,以避免OutOfMemory异常或延迟滚动
使用毕加索的示例:
Picasso.with(context).load(files.get(position)).into(holder.image);
而不是:
holder.image.setImageDrawable(images.get(position));