0

J'ai créé une application de visionneuse d'image. Cela fonctionne très bien mais quand je sélectionne un élément gridview pour le supprimer, il arrête de fonctionner. Lors de la sélection de l'élément, le bouton Supprimer apparaît. Lorsque vous cliquez sur le bouton Supprimer, une boîte de dialogue d'alerte s'affiche pour vous demander confirmation. Je souhaite que le fichier soit supprimé après avoir cliqué sur le bouton OUI. Mais ça n'arrive pas. Au lieu de cela, il lève une exception indexoutofbounds. Comment puis-je supprimer le fichier sélectionné avec succès?Supprimer l'image sélectionnée de la vue en grille Carte SD

PhotosActivity.java

import static com.example.dell_1.myapp3.ImageViewer.ImageGallery.al_images; 

public class PhotosActivity extends AppCompatActivity { 
    int int_position; 
    private GridView gridView; 
    GridViewAdapter adapter; 
    ArrayList<Model_images> al_menu = new ArrayList<>(); 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_image_gallery); 

     final ImageButton button1 = (ImageButton) findViewById(R.id.button1); 
     final ImageButton button2 = (ImageButton) findViewById(R.id.button2); 
     final ImageButton button3 = (ImageButton) findViewById(R.id.button3); 
     final ImageButton button4 = (ImageButton) findViewById(R.id.button4); 
     final ImageButton button5 = (ImageButton) findViewById(R.id.button5); 
     button1.setVisibility(View.GONE); 
     button2.setVisibility(View.GONE); 
     button3.setVisibility(View.GONE); 
     button4.setVisibility(View.GONE); 
     button5.setVisibility(View.GONE); 

     gridView = (GridView) findViewById(android.R.id.list); 
     int_position = getIntent().getIntExtra("value", 0); 
     adapter = new GridViewAdapter(this, al_images, int_position); 
     gridView.setAdapter(adapter); 

     gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
       String abc = "file://" + al_images.get(int_position).getAl_imagepath().get(position); 

       Intent i = new Intent(getApplicationContext(), FullImageActivity.class); 
       i.putExtra("id", position); 
       i.putExtra("folderPosition", int_position); 
       i.putExtra("abc", abc); 
       startActivity(i); 
      } 
     }); 

     gridView.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() { 
      @Override 
      public boolean onItemLongClick(AdapterView<?> parent, View view, final int position, long id) { 
       for (int j = 0; j < parent.getChildCount(); j++) 
        parent.getChildAt(j).setBackgroundColor(Color.TRANSPARENT); 

       // change the background color of the selected element 
       view.setBackgroundColor(Color.LTGRAY); 
       button1.setVisibility(View.VISIBLE); 
       button2.setVisibility(View.VISIBLE); 
       button3.setVisibility(View.VISIBLE); 
       button4.setVisibility(View.VISIBLE); 
       button5.setVisibility(View.VISIBLE); 
       button3.setOnClickListener(
         new View.OnClickListener() { 
          public void onClick(View view) { 
           AlertDialog.Builder builder1 = new AlertDialog.Builder(PhotosActivity.this); 
           builder1.setMessage("Are you sure you want to delete it ?"); 
           builder1.setCancelable(true); 

           builder1.setPositiveButton(
             "Yes", 
             new DialogInterface.OnClickListener() { 
              public void onClick(DialogInterface dialog, int id) { 
               File file = new File(al_menu.get(int_position).getAl_imagepath().get(position)); 
               file.delete(); 
               al_menu.remove(position); 
               adapter.notifyDataSetChanged(); 
              } 
             }); 

           builder1.setNegativeButton(
             "No", 
             new DialogInterface.OnClickListener() { 
              public void onClick(DialogInterface dialog, int id) { 
               dialog.cancel(); 
              } 
             }); 

           AlertDialog alert11 = builder1.create(); 
           alert11.show(); 
          } 
         }); 
       return true; 
      } 
     }); 


    } 
} 

ImageGallery.java:

public class ImageGallery extends AppCompatActivity { 
    public static ArrayList<Model_images> al_images = new ArrayList<>(); 
    boolean boolean_folder; 
    Adapter_PhotosFolder obj_adapter; 
    GridView gv_folder; 
    private static final int REQUEST_PERMISSIONS = 100; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_image_gallery); 
     gv_folder = (GridView) findViewById(android.R.id.list); 

     final ImageButton button1 = (ImageButton) findViewById(R.id.button1); 
     final ImageButton button2 = (ImageButton) findViewById(R.id.button2); 
     final ImageButton button3 = (ImageButton) findViewById(R.id.button3); 
     final ImageButton button4 = (ImageButton) findViewById(R.id.button4); 
     final ImageButton button5 = (ImageButton) findViewById(R.id.button5); 
     button1.setVisibility(View.GONE); 
     button2.setVisibility(View.GONE); 
     button3.setVisibility(View.GONE); 
     button4.setVisibility(View.GONE); 
     button5.setVisibility(View.GONE); 

     gv_folder.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) { 
       Intent intent = new Intent(getApplicationContext(), PhotosActivity.class); 
       intent.putExtra("value",i); 
       startActivity(intent); 
      } 
     }); 

GridViewAdapter.java:

public class GridViewAdapter extends ArrayAdapter<Model_images> { 

    Context context; 
    ViewHolder viewHolder; 
    ArrayList<Model_images> al_menu = new ArrayList<>(); 
    int int_position; 


    public GridViewAdapter(Context context, ArrayList<Model_images> al_menu,int int_position) { 
     super(context, R.layout.activity_adapter__photos_folder, al_menu); 
     this.al_menu = al_menu; 
     this.context = context; 
     this.int_position = int_position; 
    } 

    @Override 
    public int getCount() { 

     Log.e("ADAPTER LIST SIZE", al_menu.get(int_position).getAl_imagepath().size() + ""); 
     return al_menu.get(int_position).getAl_imagepath().size(); 
    } 

    @Override 
    public int getItemViewType(int position) { 
     return position; 
    } 

    @Override 
    public int getViewTypeCount() { 
     if (al_menu.get(int_position).getAl_imagepath().size() > 0) { 
      return al_menu.get(int_position).getAl_imagepath().size(); 
     } else { 
      return 1; 
     } 
    } 

    @Override 
    public long getItemId(int position) { 
     return position; 
    } 


    @Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 

     if (convertView == null) { 

      viewHolder = new ViewHolder(); 
      convertView = LayoutInflater.from(getContext()).inflate(R.layout.activity_adapter__photos_folder, parent, false); 
      viewHolder.tv_foldern = (TextView) convertView.findViewById(R.id.tv_folder); 
      viewHolder.tv_foldersize = (TextView) convertView.findViewById(R.id.tv_folder2); 
      viewHolder.iv_image = (ImageView) convertView.findViewById(R.id.iv_image); 


      convertView.setTag(viewHolder); 
     } else { 
      viewHolder = (ViewHolder) convertView.getTag(); 
     } 

     viewHolder.tv_foldern.setVisibility(View.GONE); 
     viewHolder.tv_foldersize.setVisibility(View.GONE); 



     Glide.with(context).load("file://" + al_menu.get(int_position).getAl_imagepath().get(position)) 
       .diskCacheStrategy(DiskCacheStrategy.NONE) 
       .skipMemoryCache(true) 
       .into(viewHolder.iv_image); 


     return convertView; 

    } 

    private static class ViewHolder { 
     TextView tv_foldern, tv_foldersize; 
     ImageView iv_image; 

    } 
} 

LogCat:

10-20 17:27:02.769 24402-24402/com.example.dell_1.Myapp3 E/AndroidRuntime: FATAL EXCEPTION: main 
                      Process: com.example.dell_1.Myapp3, PID: 24402 
                      java.lang.IndexOutOfBoundsException: Index: 0, Size: 0 
                       at java.util.ArrayList.get(ArrayList.java:411) 
                       at com.example.dell_1.myapp3.ImageViewer.PhotosActivity$2$1$1.onClick(PhotosActivity.java:85) 
                       at android.support.v7.app.AlertController$ButtonHandler.handleMessage(AlertController.java:161) 
                       at android.os.Handler.dispatchMessage(Handler.java:102) 
                       at android.os.Looper.loop(Looper.java:154) 
                       at android.app.ActivityThread.main(ActivityThread.java:6077) 
                       at java.lang.reflect.Method.invoke(Native Method) 
                       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865) 
                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755) 
+0

double possible de [? Quelles sont les causes java.lang.ArrayIndexOutOfBoundsException et comment puis-je empêcher] (https://stackoverflow.com/questions/5554734/what-causes-a-java- lang-arrayindexoutofboundsexception-et-how-do-i-prevent-it) – Selvin

Répondre

0

En fonction de votre code, je ne vois pas où le al_menu ArrayList est toujours chargé avec des données. Ainsi, lorsque votre onClick s'exécute et tente d'obtenir l'élément à l'index 0, vous obtenez une exception IndexOutOfBoundsException. On dirait que vous avez pour lui fournir des valeurs par défaut. Aussi à l'intérieur de GridViewAdapter vous déclarez et instanciez al_menu en haut du fichier, puis écrasez-le à l'intérieur du constructeur. Cela est inutile et provoque un objet supplémentaire à être utilisé et jeté et ne protège pas contre une exception NullPointerException plus tard dans l'adaptateur, car null peut être passé dans le constructeur GridViewAdapter et vous ne vérifiez pas pour vous en assurer. Je recommande d'ajouter une condition qui vérifie si le passé dans ArrayList n'est pas null et ajoute les valeurs à votre ArrayList en utilisant une boucle for ou même supprime la ligne d'instanciation du haut du fichier et le fait dans le constructeur de GridViewAdapter et l'utilise dans ArrayList argument en tant que paramètre s'il n'est pas null en paramètre lorsque vous instanciez votre al_menu. Exemple:

public class GridViewAdapter extends ArrayAdapter<Model_images> { 

Context context; 
ViewHolder viewHolder; 
ArrayList<Model_images> al_menu; 
int int_position; 


public GridViewAdapter(Context context, ArrayList<Model_images> al_menu,int int_position) { 
    super(context, R.layout.activity_adapter__photos_folder, al_menu); 
    if(al_menu != null) { 
     this.al_menu = new ArrayList(al_menu); 
    } 
    this.context = context; 
    this.int_position = int_position; 
} 

@Override 
public int getCount() { 

    Log.e("ADAPTER LIST SIZE", al_menu.get(int_position).getAl_imagepath().size() + ""); 
    return al_menu.get(int_position).getAl_imagepath().size(); 
} 

@Override 
public int getItemViewType(int position) { 
    return position; 
} 

@Override 
public int getViewTypeCount() { 
    if (al_menu.get(int_position).getAl_imagepath().size() > 0) { 
     return al_menu.get(int_position).getAl_imagepath().size(); 
    } else { 
     return 1; 
    } 
} 

@Override 
public long getItemId(int position) { 
    return position; 
} 


@Override 
public View getView(final int position, View convertView, ViewGroup parent) { 

    if (convertView == null) { 

     viewHolder = new ViewHolder(); 
     convertView = LayoutInflater.from(getContext()).inflate(R.layout.activity_adapter__photos_folder, parent, false); 
     viewHolder.tv_foldern = (TextView) convertView.findViewById(R.id.tv_folder); 
     viewHolder.tv_foldersize = (TextView) convertView.findViewById(R.id.tv_folder2); 
     viewHolder.iv_image = (ImageView) convertView.findViewById(R.id.iv_image); 


     convertView.setTag(viewHolder); 
    } else { 
     viewHolder = (ViewHolder) convertView.getTag(); 
    } 

    viewHolder.tv_foldern.setVisibility(View.GONE); 
    viewHolder.tv_foldersize.setVisibility(View.GONE); 



    Glide.with(context).load("file://" + al_menu.get(int_position).getAl_imagepath().get(position)) 
      .diskCacheStrategy(DiskCacheStrategy.NONE) 
      .skipMemoryCache(true) 
      .into(viewHolder.iv_image); 


    return convertView; 

} 

private static class ViewHolder { 
    TextView tv_foldern, tv_foldersize; 
    ImageView iv_image; 

} 
}