2016-06-03 5 views
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())); 

위의 문제를 피하기 위해 이미지를 하나씩 추가해야합니다. 어떻게하면 될까요? 이 문제를 해결하도록 도와주세요.

답변

0

이미지를 드로어 블 어댑터로 전달하지 마십시오. 대신 전달 된 파일을 사용하여 이미지를로드 할 수 있습니다. OutOfMemory 예외 또는 느린 스크롤을 피하려면 Picasso 또는 Glide과 같은 이미지 로더를 사용해야합니다.

Picasso.with(context).load(files.get(position)).into(holder.image); 

대신 :

holder.image.setImageDrawable(images.get(position)); 
피카소 사용

관련 문제