1
그리드보기에 이미지를 추가하려고합니다. 그리드 뷰 보이는 같은 : 이제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.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;
}
}
,이 방법을 사용하여 장치에서 이미지를 얻고있다 : 사용하여 어댑터를
public void getImages()
{
File mediaStorageDir = new File(Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_PICTURES), "AppsEye");
if(mediaStorageDir.exists())
{
String[] strings = mediaStorageDir.list();
imageTitles = new ArrayList<String>(Arrays.asList(strings));
// Log.d(TAG, "the files are: " + imageTitles);
}
try
{
for(File file : mediaStorageDir.listFiles())
{
files.add(file);
images.add(BitmapDrawable.createFromPath(file.getAbsolutePath()));
}
}
catch (Exception e)
{
e.printStackTrace();
// Log.d(TAG,"Got some exceptoin ");
}
}
을 그리고 설정 :
gridView = (GridView)view.findViewById(R.id.gridView);
// Log.d(TAG,"I am gallery");
getImages();
gridViewAdapter = new GridViewAdapter(getActivity(),images,imageTitles,files);
gridView.setAdapter(gridViewAdapter);
return view;
문제를 위의 코드와 함께 실행시에 많은 이미지를 추가하면 런타임 오류가 메모리 부족 오류로 나타납니다.
images.add(BitmapDrawable.createFromPath(file.getAbsolutePath()));
위의 문제를 피하기 위해 이미지를 하나씩 추가해야합니다. 어떻게하면 될까요? 이 문제를 해결하도록 도와주세요.