Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 将图像动态添加到gridview会导致内存不足错误_Android_Gridview - Fatal编程技术网

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