2016-06-03 7 views
1

Ich versuche, Bilder zu einer Rasteransicht hinzuzufügen. Die Ansicht Gitter wie folgt aussieht:Das dynamische Hinzufügen von Bildern zur Gridview führt zu einem Speicherfehler.

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


} 

Jetzt erhalte ich Bilder von meinem Gerät mit dieser Methode:

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

Und Einstellung Adapter:

 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; 

Das Problem mit obigem Code ist, dass während der Laufzeit das Hinzufügen einer Menge von Bildern zu images Laufzeitfehler wegen Speichermangel ergibt.

Also, um obige Probleme zu vermeiden, muss ich Bilder der Gridview eins nach dem anderen hinzufügen. Wie kann ich das erreichen? Bitte hilf mir, das zu lösen.

Antwort

0

Sie sollten Ihre Bilder nicht als Zeichen an Ihren Adapter weitergeben. Stattdessen können Sie die übergebenen Dateien verwenden, um Ihre Bilder zu laden. Sie müssen einen Image Loader wie Picasso oder Glide verwenden, um OutOfMemory-Ausnahmen oder Laggy-Scrollen zu vermeiden.

Beispiel unter Verwendung von Picasso:

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

Statt:

holder.image.setImageDrawable(images.get(position)); 
Verwandte Themen