0

나는 imageviewer 앱을 만들었습니다. 잘 작동하지만 삭제할 gridview 항목을 선택하면 작업이 중지됩니다. 항목을 선택하면 삭제 버튼이 나타납니다. 삭제 버튼을 클릭하면 확인을 요청하는 경고 대화 상자가 나타납니다. 예 버튼을 누른 후 파일이 삭제되기를 원합니다. 그러나 그것은 일어나지 않습니다. 대신 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; 

    } 
} 

로그 캣은 다음의 ArrayList al_menu 이제까지 데이터가로드되는 경우 코드를 기반으로

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-causes-a-java- lang-arrayindexoutbound outseout-out-do-i-prevent-it) – Selvin

답변

0

, 나는 볼 수 없습니다. 따라서 onClick을 실행하고 인덱스 0에서 항목을 가져 오려고하면 IndexOutOfBoundsException 예외가 발생합니다. 기본 값을 제공해야하는 것처럼 보입니다. 또한 GridViewAdapter 내부에서 파일 맨 위에 al_menu를 선언하고 인스턴스화 한 다음 생성자 내부에서 덮어 씁니다. null이 GridViewAdapter의 생성자로 전달 될 수 있고 그 것을 확인하지 않기 때문에 불필요하며 여분의 객체가 사용되어 폐기되는 원인이되며 나중에 어댑터에서 NullPointerException을 방지하지 못합니다. ArrayList에 전달 된 값이 null이 아닌지 검사하여 for 루프를 사용하여 ArrayList에 값을 추가하거나 심지어 파일의 맨 위에서 인스턴스화 행을 제거하고 GridViewAdapter의 생성자에서 수행하고 ArrayList에서 사용하는 조건을 추가하는 것이 좋습니다. al_menu를 인스턴스화 할 때 매개 변수로서 null이 아닌 경우 매개 변수로 인수. 예 :의

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; 

} 
}