0

我創建了一個imageviewer應用程序。它的工作正常,但是當我選擇一個gridview項目刪除它,它停止工作。在選擇項目時,出現刪除按鈕。點擊刪除按鈕後,會出現一個提示對話框,要求確認。我希望在點擊YES按鈕後刪除文件。但它沒有發生。相反,它會引發一個indexoutofbounds異常。我如何才能成功刪除選定的文件?從網格視圖中刪除所選圖像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

的可能的複製[?什麼原因導致java.lang.ArrayIndexOutOfBoundsException以及如何阻止它(https://stackoverflow.com/questions/5554734/what-c​​auses-a-java-郎ArrayIndexOutOfBoundsException異常和知識-DO-I-防止-IT) – Selvin

回答

0

基於您的代碼,我沒有看到,其中的ArrayList al_menu是不斷加載數據。因此,當onClick執行並嘗試獲取索引0處的項目時,會出現IndexOutOfBoundsException異常。看起來像你需要提供默認值。同樣在GridViewAdapter中,您聲明並實例化文件頂部的al_menu,然後在構造函數中覆蓋它。這是不必要的,並且會導致額外的對象被使用和拋出,並且不會在適配器的後面保護NullPointerException,因爲null可能會傳遞到GridViewAdapter的構造函數中,並且您不檢查以確保這一點。我建議添加一個條件來檢查在ArrayList中傳遞的值是否爲null,並使用for循環將值添加到ArrayList中,或者甚至從文件頂部刪除實例化行,並在GridViewAdapter的構造函數中執行並在ArrayList中使用參數作爲參數,如果它在你實例化你的al_menu時不是作爲參數。 例子:

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; 

} 
}