2015-10-14 50 views
0

我正在实施删除网格视图上的多个图像删除按钮单击。我在Grid-View中放置了复选框和图像视图。我在图像上选择了多个复选框,这些图像被删除,但有时候我的应用程序崩溃并且得到异常java.lang.IndexOutOfBoundsException:索引5无效,大小为4在这一行= data.remove(pos);在复选框中单击事件。如何解决此问题。Android:java.lang.IndexOutOfBoundsException:索引5无效,大小为4

这是我在Adapter类代码

final BitmapItems item = data.get(position); 
     //holder.imageTitle.setText(item.getTitle()); 
     holder.image.setImageBitmap(item.getBitmap()); 
      final int pos = position; 
      Log.e("pos ", " = " + pos); 

      holder.checkbox.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) 
       { 
        CheckBox cb = (CheckBox) v; 
        Toast.makeText(getContext(), "Clicked on Checkbox: " + cb.getText() + " is " + cb.isChecked(), Toast.LENGTH_LONG).show(); 
        if(cb.isChecked()) 
        { 
         int checked = 1; 
         Log.e("", "" + checked); 
         String path = ((String) f.get(pos)); 
         selectedFile.add(path); 
         Log.e("path ", " = " + path); 
         data.remove(pos); 
        } 
        else 
        { 
         int checked = 0; 
         Log.e("",""+ checked); 
        } 
       } 
      }); 

这是在练习我的删除按钮的代码

imgDeleteImagesFromGallery = (ImageView)findViewById(R.id.imgDeleteImage); 
     imgDeleteImagesFromGallery.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) 
      { 
       gridAdapter.notifyDataSetChanged(); 

       Iterator iterator = selectedFile.iterator(); 
       while (iterator.hasNext()) 
       { 
        gridFilePath = new File(iterator.next().toString()); 
        if(gridFilePath.exists()) 
        { 
         gridFilePath.delete(); 
         Log.e("File deleted","Succesfully !!"); 
        } 
       } 
      } 
     }); 

这里登录猫错误

10-14 04:16:02.635 15018-15018/? E/AndroidRuntime﹕ FATAL EXCEPTION: main 
    Process: com.example.tazeen.classnkk, PID: 15018 
    java.lang.IndexOutOfBoundsException: Invalid index 5, size is 4 
      at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255) 
      at java.util.ArrayList.remove(ArrayList.java:403) 
      at com.example.tazeen.classnkk.AddPost$GridView_Adapter$1.onClick(AddPost.java:931) 
      at android.view.View.performClick(View.java:4756) 
      at android.widget.CompoundButton.performClick(CompoundButton.java:125) 
      at android.view.View$PerformClick.run(View.java:19748) 
      at android.os.Handler.handleCallback(Handler.java:739) 
      at android.os.Handler.dispatchMessage(Handler.java:95) 
      at android.os.Looper.loop(Looper.java:135) 
      at android.app.ActivityThread.main(ActivityThread.java:5254) 
      at java.lang.reflect.Method.invoke(Native Method) 
      at java.lang.reflect.Method.invoke(Method.java:372) 
      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:898) 
      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:693) 
+2

尝试设置POS的位置1 – dasjkdj

+0

那么,如果大小为4,你可以” t删除5的索引,但你已经知道了。可能的原因是用户可能已经快速轻敲了两次,并且在物品被移除后第二次来电。只需在删除调用之前添加一个数组大小检查 – e4c5

回答

2

你正在因为错误数组大小是从(0-4)开始的4次计数,但索引是从(1-5)开始的5次计数,因此使用此代码。我已经添加位置1

final BitmapItems item = data.get(position); 
     //holder.imageTitle.setText(item.getTitle()); 
     holder.image.setImageBitmap(item.getBitmap()); 
      final int pos = position; 
      Log.e("pos ", " = " + pos); 

      holder.checkbox.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View v) 
       { 
        CheckBox cb = (CheckBox) v; 
        Toast.makeText(getContext(), "Clicked on Checkbox: " + cb.getText() + " is " + cb.isChecked(), Toast.LENGTH_LONG).show(); 
        if(cb.isChecked()) 
        { 
         int checked = 1; 
         Log.e("", "" + checked); 
         String path = ((String) f.get(pos)); 
         selectedFile.add(path); 
         Log.e("path ", " = " + path); 
         data.remove(pos-1); 
        } 
        else 
        { 
         int checked = 0; 
         Log.e("",""+ checked); 
        } 
       } 
      }); 
+0

我使用data.remove(pos-1)在代码中进行更改;这也是final int pos = position - 1;但是当我检查图像的第一个位置时,它会再次崩溃应用程序,并得到相同的错误java.lang.ArrayIndexOutOfBoundsException:length = 202; index = -1 – androidTag

+0

不要把两个(pos =位置-1)data.remove(pos-1);只放data.remove(pos-1);那么它会工作 – Jagan

+0

我在说我第一次尝试这两个线(pos =位置-1),当我得到错误我删除,第二个这样data.remove(pos-1);但仍然得到相同的错误ArrayIndexOutOfBoundsException:length = 202; index = -1当我选择第一个图像的gridview意味着复选框。 – androidTag

0

尝试设置POS的位置1,因为它可能是复选框位置不从0开始,但在1
这可以解释为什么该指数试图访问数组的大小+ 1
我相信这样做的正确的地方会在此行:

holder.image.setImageBitmap(item.getBitmap()); 
     final int pos = position - 1 ; //here 
     Log.e("pos ", " = " + pos); 
+0

有人可以给我建议吗? – androidTag

+0

@androidTag你是什么意思建议哥们?你试过这个吗?结果是什么?你还试过了什么? – dasjkdj

+0

我试过你的代码。如果5图像是在网格视图中,当我选择第一个图像意味着第0个位置的图像应用程序将crash.And我想从网格视图中删除多选图像。 – androidTag

相关问题